ICS以降はActionbarが推奨され、消えてしまったメニューボタンですが、
救済策として、メニューキーのない端末では画面の右下にメニューボタンが表示されます。
しかし、target-sdkが14以上の場合、これらのボタンは表示されず、
requestWindowFeature(Window.FEATURE_NO_TITLE);のようにしてタイトルバー(アクションバー)を消している場合、オプションメニューにアクセスできなくなってしまいます。
target-sdkが13以下の時はメニューが表示されるようです。
どうしても従来のメニューボタンを表示させておきたい場合は、target-sdkを13以下にしておきましょう。
なお、target-sdkが11以上( Honeycomb以降 )の場合、デフォルトのテーマはHoloになります。
なので、テーマがHoloでメニューボタンを表示させたい場合、target-sdkは11-13を選択すれば良いことになります。
※target-sdkを11-13にしても、tabletの場合はレガシーメニューボタンが表示されません。こればっかりは仕方ありません。タブレット場合はActionBarを表示するようにしましょう。端末がタブレットか否かを調べる方法は以下のリンクに書いてあります。
http://stackoverflow.com/questions/5832368/tablet-or-phone-android
2012年11月24日土曜日
2012年11月23日金曜日
PreferenceActivity and Intent
The information about PreferenceActivity is here.
We can use intents in PreferenceActivity.
We can use intents in PreferenceActivity.
Here is some examples of usage of <intent> in PreferenceActivity.
<PreferenceScreen android:title="Show in market." > <intent android:action="android.intent.action.VIEW" android:data="market://details?id=jp.ne.sakura.ccice.audipo" /> </PreferenceScreen>
<PreferenceScreen android:title="Send an mail to developer." > <intent android:action="android.intent.action.VIEW" android:data="mailto:hogehoge@foo.com" /> </PreferenceScreen>
<PreferenceScreen android:title="Share this app." > <intent android:action="android.intent.action.SEND" android:mimeType="text/plain" > <extra android:name="android.intent.extra.TEXT" android:value="Texts to share." /> </intent> </PreferenceScreen>
2012年11月14日水曜日
Solve "Signature Verification Failed" error
I met Signature Verification Failed error in CWM. when I updated my Galaxy Nexus(yakju) ( OTA , JRO03C to JZO54K )
I remembered My Galaxy Nexus was rooted by Nexus Root Toolkit(NRT) 1.5.2.
I tried to root Galaxy Nexus again with Nexus Root Toolkit 1.5.5 ( newest version ).
And flash OTA again.
Now, CWM didn't say any error.
I use NRT again to root the device this time!
I remembered My Galaxy Nexus was rooted by Nexus Root Toolkit(NRT) 1.5.2.
I tried to root Galaxy Nexus again with Nexus Root Toolkit 1.5.5 ( newest version ).
And flash OTA again.
Now, CWM didn't say any error.
I use NRT again to root the device this time!
2012年11月8日木曜日
RemoteControleClientを使うにはAudioFocusが必要
RemoteControlClientはテクブに書いてある通りに書けば動きま・・・せん。
リモートコントロールを表示するにはAudioFocusを取得する必要があります。
省略されているのは、それくらい常識って事なんでしょうか。
MusicIntentRecieverはAndroid SDKのサンプルのRandomMusicPlayerに含まれているものが使えます。そちらを参考にして下さい。
リモートコントロールを表示するにはAudioFocusを取得する必要があります。
省略されているのは、それくらい常識って事なんでしょうか。
ComponentName myEventReceiver = new ComponentName(getPackageName(), MusicIntentReciever.class.getName()); AudioManager myAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); myAudioManager.registerMediaButtonEventReceiver(myEventReceiver); myAudioManager.requestAudioFocus( new OnAudioFocusChangeListener() { @Override public void onAudioFocusChange(int focusChange) { Log.d(TAG, "focusChanged:"+focusChange ); } } , AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); // build the PendingIntent for the remote control client Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); mediaButtonIntent.setComponent(myEventReceiver); PendingIntent mediaPendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, 0); // create and register the remote control client mRemoteControlClient = new RemoteControlClient(mediaPendingIntent); myAudioManager.registerRemoteControlClient(mRemoteControlClient); mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); mRemoteControlClient.setTransportControlFlags( RemoteControlClient.FLAG_KEY_MEDIA_PLAY | RemoteControlClient.FLAG_KEY_MEDIA_PAUSE | RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS | RemoteControlClient.FLAG_KEY_MEDIA_NEXT | RemoteControlClient.FLAG_KEY_MEDIA_STOP); mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); mRemoteControlClient.editMetadata(true) .putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, "a") .putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, "b") .putString(MediaMetadataRetriever.METADATA_KEY_TITLE, "c") .apply();
MusicIntentRecieverはAndroid SDKのサンプルのRandomMusicPlayerに含まれているものが使えます。そちらを参考にして下さい。
2012年8月20日月曜日
EclipseでAndroid Support Library のソースを見られるようにする
Android Support Library のソースは(SDK ManagerでDLしていれば)
<android-sdk-dir>/extras/android/support/v4/src
にある。
Eclipseで見れるようにするにはこれをattachすれば良いだけ。
・・・のはずが、ADT20では正攻法ではできない。
解決策は
libs/android-support-v13.jar.properties
なるファイルを作り、この中に下記の様に1行書く。
あとは、プロジェクトを閉じる⇛開くするだけ。
これでソースが見れるようになる。
参考:http://code.google.com/p/android/issues/detail?id=28658
src=<android-sdk-dir>/extras/android/support/v4/src
これでソースが見れるようになる。
2012年8月14日火曜日
非root環境でADB経由でアプリを終了する
アプリをADB経由で終了するには
adb shell kill <PID>
とすれば良い。
しかし、これにはroot権限が必要なので、非root端末には使えない。
だが非root端末でも、ユーザーがアプリ情報画面から強制終了ボタンを押せば終了することはできる。
以下は、それをmonkeyrunnerで実施するコードだ。
UIを占有する必要があるが、一応アプリを終了する事ができる。
monkeyrunner killhoge.py
adb shell kill <PID>
とすれば良い。
しかし、これにはroot権限が必要なので、非root端末には使えない。
だが非root端末でも、ユーザーがアプリ情報画面から強制終了ボタンを押せば終了することはできる。
以下は、それをmonkeyrunnerで実施するコードだ。
UIを占有する必要があるが、一応アプリを終了する事ができる。
monkeyrunner killhoge.py
from com.android.monkeyrunner import ( MonkeyRunner, MonkeyDevice, MonkeyImage ) import time device = MonkeyRunner.waitForConnection() #対象のアプリのパッケージ名 package = 'com.sample.hoge' #強制終了ボタンの位置と、OKボタンの位置。デバイス依存 exitButton = [130, 180] okButton = [130, 550 ] #アプリ情報画面を呼び出し device.startActivity( action='android.settings.APPLICATION_DETAILS_SETTINGS', uri='package:'+package) time.sleep(1) device.touch( exitButton[0], exitButton[1], MonkeyDevice.DOWN_AND_UP) time.sleep(1) device.touch( okButton[0], okButton[1], MonkeyDevice.DOWN_AND_UP)
2012年8月1日水曜日
Androidでキーボードが表示された時のイベントを発生させる
Androidにはソフトウェアキーボードの表示/非表示のを検出するようなイベントは用意されていない。
調べてみると、ソフトウェアキーボードが表示された時にActivityのサイズが変わることを使ってそのON/OFFを検知するのが一般的なようだ。
ありがたいことに、以下のページで、ソフトキーボードの表示/非表示を検出するクラス(DetectableKeyboardEventLayoutクラス)が公開されている。
Android のソフトウェアキーボード表示・非表示を検出する
このDetectableKeyboardEventLayoutクラスはLinearLayoutを継承しているので、キーボードのON/OFFを検知するクラスのレイアウトのルートにこのクラスを挿入してやれば簡単にキーボード表示/非表示時のイベントを取得できる。
調べてみると、ソフトウェアキーボードが表示された時にActivityのサイズが変わることを使ってそのON/OFFを検知するのが一般的なようだ。
ありがたいことに、以下のページで、ソフトキーボードの表示/非表示を検出するクラス(DetectableKeyboardEventLayoutクラス)が公開されている。
Android のソフトウェアキーボード表示・非表示を検出する
このDetectableKeyboardEventLayoutクラスはLinearLayoutを継承しているので、キーボードのON/OFFを検知するクラスのレイアウトのルートにこのクラスを挿入してやれば簡単にキーボード表示/非表示時のイベントを取得できる。
<package.DetectableKeyboardEventLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/root" > <!-- main layout --> </package.DetectableKeyboardEventLayout>
DetectableKeyboardEventLayout root = (DetectableKeyboardEventLayout)findViewById(R.id.root); root.setKeyboardListener( new KeyboardListener() { @Override public void onKeyboardShown() { Log.d(TAG, "keyboard shown"); } @Override public void onKeyboardHidden() { Log.d(TAG, "keyboard hidden"); } });
2012年7月31日火曜日
当月分のXiのデータ通信使用料の確認方法
Xiのデータ通信量はMy Docomoから確認できます。(下記リンクからログイン)
確認できるのは、当月利用分と、過去3日分です。
Xiデータ通信量確認(当月ご利用分) | 料金の確認・お支払い | My docomo(マイドコモ) | NTTドコモ
確認できるのは、当月利用分と、過去3日分です。
Xiデータ通信量確認(当月ご利用分) | 料金の確認・お支払い | My docomo(マイドコモ) | NTTドコモ
2012年7月19日木曜日
aptana3で (NoMethodError) undefined method 't'
Aptana3で何かBundleをインストールした時に、下記のようなエラーが出ることがある。
どうやらAptana3.1以上からサポートされたメソッドらしい。
Aptanaのバージョンを上げれば出なくなる。
https://github.com/aptana/studio3/issues/27
An error occurred while executing /Users/*/Documents/Aptana Rubles/javascript-jquery.ruble/bundle.rb:
どうやらAptana3.1以上からサポートされたメソッドらしい。
Aptanaのバージョンを上げれば出なくなる。
https://github.com/aptana/studio3/issues/27
2012年7月12日木曜日
Eclipse+ADTの環境で、Eclipse起動直後にフリーズする
EclipseでAndroidの開発をしていると、Eclipse起動直後にフリーズすることがある。
プログレスウィンドウを見ると"android library update"で止まってたりする。
どうやら"Building workspace"の状態でEclipseが落ちると、次回起動時必ずこういう状態になるらしい。
解決策は全てのadbプロセスを落とす事。
これで動くようになる。
http://stackoverflow.com/questions/4742938/eclipse-android-sdk-building-workspace-deadlock
プログレスウィンドウを見ると"android library update"で止まってたりする。
どうやら"Building workspace"の状態でEclipseが落ちると、次回起動時必ずこういう状態になるらしい。
解決策は全てのadbプロセスを落とす事。
これで動くようになる。
http://stackoverflow.com/questions/4742938/eclipse-android-sdk-building-workspace-deadlock
2012年6月17日日曜日
getSupportActionBar()がnullを返す
ActionBarSherlockを使うと、ActionBarをHonycomb以前の端末でも利用できる。
さて、ActionBarを取得する最も基本的なメソッドがgetSupportActionBar()だ。
このメソッドを使うときには注意が必要で、Sherlockテーマを利用していなければnullが返される。
Manifestファイルを下記のように変更するなどしてSherlockテーマを使うようにしよう。
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable="false" android:theme="@style/Theme.Sherlock">
2012年6月12日火曜日
twitcleで別アカウントから返信、ふぁぼ、リツイートする方法
最近話題のtwitcleをインストールして使ってみました。
ツイートを長押しすると複数選択になるところや、設定を反映するのに決定ボタンを押させるところなど、UIははかなりtwiccaに似ていますね。(というかこの辺はtwiccaを参考にして作られたんだと思います。)
twiccaユーザーはかなりスムーズに移行出来ちゃうと思います。
さて、twiccaとの最大の違いはフリックによるカラムの切り替えとマルチアカウントの公式対応でしょう。
ここでは、その内のマルチアカウント対応について不足機能を補う方法をご紹介します。
その不足機能とは、ツイートを別のアカウントから返信したりふぁぼったり公式リツイートする方法です。
通常だと、TL上のツイートをタップするとメニューが出るのですが、その状態でアカウントを切り替える事は出来ません。
ですが、ツイートをタップするとほぼ同時に右上のアカウント選択ボタンを押すと、メニューの上にアカウント選択画面が出ます(右図参照)。
この状態でアカウントを切り替えてやれば切り替え後のアカウントから各操作が出来ます。
お試しあれ。
作者さん、ダイアログが出ている間もユーザー切り替え可能ボタンを押せるようにして頂ければと思います。是非。
ツイートを長押しすると複数選択になるところや、設定を反映するのに決定ボタンを押させるところなど、UIははかなりtwiccaに似ていますね。(というかこの辺はtwiccaを参考にして作られたんだと思います。)
twiccaユーザーはかなりスムーズに移行出来ちゃうと思います。
さて、twiccaとの最大の違いはフリックによるカラムの切り替えとマルチアカウントの公式対応でしょう。
ここでは、その内のマルチアカウント対応について不足機能を補う方法をご紹介します。
その不足機能とは、ツイートを別のアカウントから返信したりふぁぼったり公式リツイートする方法です。
メニューの上にアカウント選択画面が 出ている状態 |
ですが、ツイートをタップするとほぼ同時に右上のアカウント選択ボタンを押すと、メニューの上にアカウント選択画面が出ます(右図参照)。
この状態でアカウントを切り替えてやれば切り替え後のアカウントから各操作が出来ます。
お試しあれ。
作者さん、ダイアログが出ている間もユーザー切り替え可能ボタンを押せるようにして頂ければと思います。是非。
2012年6月5日火曜日
Contactsデータの実体
ContactsAPIの使い方よくわからん!って人はデータの実体を見てからドキュメントを読むとすんなり行くかも。
/data/data/com.android.providers.contacts/databases/ 以下にあります。
(当然要root)
/data/data/com.android.providers.contacts/databases/ 以下にあります。
(当然要root)
AT700のadbドライバーのインストール方法
AT700のadbドライバーのインストールに手間取った。
以下某掲示板より抜粋+α。この手順でadbドライバのインストールに成功した。
※ただしこの方法では、「Android ADB Interface」を削除してMTPドライバをインストールし直さないと、通常のMTP接続できなくなる らしいので注意。
1.GoogleのUSBドライバー内の”android_winusb.inf”に以下の行を追加する。
[Google.NTx86]
;REGZA AT700
%SingleAdbInterface% = USB_Install, USB\VID_0930&PID_0960
%CompositeAdbInterface% = USB_Install, USB\VID_0930&PID_0960&MI_00
[Google.NTamd64]
;REGZA AT700
%SingleAdbInterface% = USB_Install, USB\VID_0930&PID_0960
%CompositeAdbInterface% = USB_Install, USB\VID_0930&PID_0960&MI_00
2.PCとAT700が接続されて「いない」ことを確認
3.(AT700)設定→アプリケーション→開発→USBデバッグの、チェックを「OFF」 4.USBでPCとAT700を接続
5.(Win7)ドライバのインストールがもりもり始まるので、終わるまで全裸で待機
6.(AT700)設定→アプリケーション→開発→USBデバッグの、チェックを「ON」
7.(Win7)デバイスマネージャーを開き、「ポータブル デバイス」一覧から、「AT200」を探し出す
※この時点で、もし「USB Composite Device」があれば、削除すること
その後、USBケーブルを引っこ抜き、PCを再起動して2からやり直す
8.(Win7)「AT200」を右クリ→ドライバー ソフトウェアの更新
9.(Win7)「コンピュータを参照してドライバー ソフトウェアを検索します」をクリック
10.(Win7)「次の場所で~」とあるので、Google 謹製 USBドライバの格納フォルダを指定してインストール
2012年5月8日火曜日
DatePicker, TimePickerをスライド式のビューにする
DatePickerやTimePickerは、HoneyComb以前は+ボタンが上下に付くタイプの物でしたが、HoneyComb以降はフリックで日付が変えられるタイプのものが利用できます。
ICSで表示したDatePicker / TimePickerの例
変え方は簡単、targetSdkVersionを14にするだけです。
以下の要領でmanifestを編集することで切り替えられます。
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="14"></uses-sdk>
ただ、これに伴って他のviewのスタイルも変わるので要注意。
2012年4月10日火曜日
Twiccaで別アカウントでリツイート・ふぁぼ
TwiccaはTwicca Supportersになると実験的な機能でマルチアカウントを利用できる。
この機能を使うと右上のボタンでアカウントを切り替えられるので便利だ。
だが、残念ながらTL上のツイートを別のアカウントからリツイートする機能はない。
こんな時には一回ツイートを開いてからアカウントを切り替えれば良い。
ツイートを開くには下記プラグインを使うと便利(ステマ)。
http://play.google.com/store/apps/details?id=jp.ne.sakura.ccice.owt
手順は、まずRTしたいタップして、メニューを表示する。
次に「ツイートを開く」を選択する。そうすると、↓のようなアプリケーション選択画面が出る。
この状態で右上のアカウント名ボタンから別のアカウントを選択すれば、対象のツイートを表示したままアカウントを切り替えられる。
その状態でリツイートすれば、変更後のアカウントからリツイートされる。
ちなみに、同じ要領で別のアカウントでふぁぼることも簡単にできる。
この機能を使うと右上のボタンでアカウントを切り替えられるので便利だ。
だが、残念ながらTL上のツイートを別のアカウントからリツイートする機能はない。
こんな時には一回ツイートを開いてからアカウントを切り替えれば良い。
ツイートを開くには下記プラグインを使うと便利(ステマ)。
http://play.google.com/store/apps/details?id=jp.ne.sakura.ccice.owt
手順は、まずRTしたいタップして、メニューを表示する。
次に「ツイートを開く」を選択する。そうすると、↓のようなアプリケーション選択画面が出る。
Twiccaを選択すると↓のように、このツイートだけが表示される。
この状態で右上のアカウント名ボタンから別のアカウントを選択すれば、対象のツイートを表示したままアカウントを切り替えられる。
その状態でリツイートすれば、変更後のアカウントからリツイートされる。
ちなみに、同じ要領で別のアカウントでふぁぼることも簡単にできる。
2012年4月1日日曜日
Eclipseのメソッド名入力時の括弧補完は無効にできないが、無視はできる。
Eclipseでメッソド名を補完すると、閉じ括弧まで補完されてしまう。
これが予想以上にうざい。
何故なら単純に考えると、引数を入力した後に、わざわざカーソルキーの→を押して移動してから;を打たないとけないからだ。
ホームポジションからずらさなくて良い分、閉じ括弧を打った方が断然やりやすい。
(Emacs風キーバインドでやってる人は全く問題ないのかもしれないが)
で、解決方法を探してみたが、どうも解決手段は無いようだ。
つまり、この括弧の補完を無効にする方法は無い。
が、実は無視はできる。
function( ) と保管された状態でhoge);と打つと
function(hoge);) となりそうなものだが、実際には
function(hoge); と、括弧の補完を無視してくれる。
じゃあ、最初から補完するなよ、と言いたくなるが、とりあえず今の解決策はこれに慣れるしかないようだ。
参考
http://stackoverflow.com/questions/2843759/cant-disable-method-parenthesis-auto-complete-in-eclipse
これが予想以上にうざい。
何故なら単純に考えると、引数を入力した後に、わざわざカーソルキーの→を押して移動してから;を打たないとけないからだ。
ホームポジションからずらさなくて良い分、閉じ括弧を打った方が断然やりやすい。
(Emacs風キーバインドでやってる人は全く問題ないのかもしれないが)
で、解決方法を探してみたが、どうも解決手段は無いようだ。
つまり、この括弧の補完を無効にする方法は無い。
が、実は無視はできる。
function( ) と保管された状態でhoge);と打つと
function(hoge);) となりそうなものだが、実際には
function(hoge); と、括弧の補完を無視してくれる。
じゃあ、最初から補完するなよ、と言いたくなるが、とりあえず今の解決策はこれに慣れるしかないようだ。
参考
http://stackoverflow.com/questions/2843759/cant-disable-method-parenthesis-auto-complete-in-eclipse
2012年3月31日土曜日
Android Emulator の実行中に拡大縮小を行う
Android Emulatorは、起動時にパラメータを与えることで拡大縮小できる。
これを起動してから動的に変えられたら便利だ。
実はadbのemuオプションを使うことでエミューレータコマンドを即時実行できるので、これを利用すると実現できる。
↓半分に縮小する場合
adb emu window scale 0.5
これを起動してから動的に変えられたら便利だ。
実はadbのemuオプションを使うことでエミューレータコマンドを即時実行できるので、これを利用すると実現できる。
↓半分に縮小する場合
adb emu window scale 0.5
EGitで Checkout Conflictsが出た時の対処法(Git初心者向け)
Eclipse でGitが利用できる EGitは便利。だけどGitそのものを理解していないと思わぬところでつまづく。例えば、コンフリクト。
↓はCheckout Confilictsの警告ダイアログ
対処法としては状況に応じて以下を実行すれば良い。
1.現在の変更を残したい
→ ブランチ切ってCommit
Team -> Switch To -> New Branchからブランチを作成して、Team- > Commit とすれば良い
2.現在の変更を他のコミットと統合したい
→Merge
下記が詳しい。
http://d.hatena.ne.jp/Hirohiro/20111122/1321964799
3.現在の変更を破棄したい
Team -> Replace With -> Commitから、置き換えたいコミットを選択する。
Git GUIが起動しない時の対処法
msysgitが立ち上がらなくなった。
立ち上げようとするとエラーが出る。
エラーの文字列中にはrecentrepo= ...という文字列の後ろに文字化けしている文字列が見える。
どうやら直近で使ったリポジトリに日本語が入っているとダメなようだ。
で、この問題、厄介なのことに再インストールしても現象が直らないのだ。
対処法として履歴は下記のファイルに格納されているので、これを消せば治る。
C:¥Users¥<ユーザー名>¥..gitconfig
アンインストールでこれも消して欲しかったなあ。
2012年3月22日木曜日
JSONIC EVO3Dで なんか重いよ
ATNDの検索APIで取得したデータのデコードにJSONICを使っていた。
ずっとGalaxy Nexusでデバッグしていて問題なかったのだが、
EVO3Dで動かしてみたら極端に重い。
GNならば1秒未満で終わる処理が、
EVO3Dでは約13秒もかかる。
一応明言しておくと、測定は
JSON.decode(str, EventsResult.class);
の前後に入れたLog.dのタイムスタンプの差分で計測。
決してhttp getの時間は入っていない。
うーんなんだろう。なんか気になる。
EVO3Dって ADW.Launcherのドロワーが重かったりするから、特定の処理に弱いとかあるのかな。不思議。(無料版の話、Exは問題なく動いている)
で、回避策としてgsonを使ってみた。
無事EVO3Dでも1秒未満(大体200ms未満)でデコードが完了できることが確認できた。
測定結果(ざっくり)
Galaxy Nexus × gson ・・・・ 200ms以下
EVO3D × gson ・・・・・・・ 200ms以下
Galaxy Nexus × JSONIC ・・・ 200ms以下
EVO3D × JSONIC ・・・・ 13000ms程度 ← なぜ?
ずっとGalaxy Nexusでデバッグしていて問題なかったのだが、
EVO3Dで動かしてみたら極端に重い。
GNならば1秒未満で終わる処理が、
EVO3Dでは約13秒もかかる。
一応明言しておくと、測定は
JSON.decode(str, EventsResult.class);
の前後に入れたLog.dのタイムスタンプの差分で計測。
決してhttp getの時間は入っていない。
うーんなんだろう。なんか気になる。
EVO3Dって ADW.Launcherのドロワーが重かったりするから、特定の処理に弱いとかあるのかな。不思議。(無料版の話、Exは問題なく動いている)
で、回避策としてgsonを使ってみた。
無事EVO3Dでも1秒未満(大体200ms未満)でデコードが完了できることが確認できた。
測定結果(ざっくり)
Galaxy Nexus × gson ・・・・ 200ms以下
EVO3D × gson ・・・・・・・ 200ms以下
Galaxy Nexus × JSONIC ・・・ 200ms以下
EVO3D × JSONIC ・・・・ 13000ms程度 ← なぜ?
2012年3月20日火曜日
Androidのデータベース周りでよくわからないエラーが出る
Androidのデータベース周りでよくわからないところでエラーが出ることがある。
例えばこんなの。
Caused by: java.lang.IllegalStateException: Don't have database lock! Caused by: android.database.sqlite.SQLiteDatabaseLockedException: database is locked
こういうのが出た場合は以下をチェック
・複数のSQLiteOpenHelperクラスのインスタンスから同じデータベースへアクセスしている。(singletonモデルにするなどしよう。ちなみにSQLiteDatabaseインスタンスへのsetLockingEnableをtrueにしておけばスレッドセーフだ(デフォルトでtrue)。)
・bigenTransactionをしたままendTransactionをしてない。
例えばこんなの。
Caused by: java.lang.IllegalStateException: Don't have database lock! Caused by: android.database.sqlite.SQLiteDatabaseLockedException: database is locked
こういうのが出た場合は以下をチェック
・複数のSQLiteOpenHelperクラスのインスタンスから同じデータベースへアクセスしている。(singletonモデルにするなどしよう。ちなみにSQLiteDatabaseインスタンスへのsetLockingEnableをtrueにしておけばスレッドセーフだ(デフォルトでtrue)。)
・bigenTransactionをしたままendTransactionをしてない。
2012年3月18日日曜日
fragment 版 findviewbyid
XMLで定義したFragmentを取得するには
FragmentManager#findFragmentById( id )を使う
FragmentManager fm = getFragmentManager(); MyFragment fragment = (MyFragment)fm.findFragmentById( R.id.fragment );
以上
2012年3月17日土曜日
setState( new int[]{ android.R.attr.state_selected} ); が効かない
以下のようなdrawableをbackgroundに指定したViewで 、stateを反映したい。
v.getBackground().setState( new int[]{ android.R.attr.state_selected} );
としても全然反映されないし、困ってた。
解決手段は
v.setSelected();
とすること。
selected限定なのでオールマイティじゃないけど、ま良い。
v.getBackground().setState( new int[]{ android.R.attr.state_selected} );
としても全然反映されないし、困ってた。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 非選択時 -->
<item
android:state_selected="false"
android:drawable="@drawable/tab_unselected"
/>
<!-- 選択時 -->
<item
android:state_selected="true"
android:drawable="@drawable/tab_selected"
/>
</selector>
解決手段は
v.setSelected();
とすること。
selected限定なのでオールマイティじゃないけど、ま良い。
エラー No view found for id 0xffffffff for fragment の原因
ViewPagerでフラグメントを使ってみようと、こんなコードを書いてみた
そしたらこんなエラーが出た。
java.lang.IllegalArgumentException: No view found for id 0xffffffff for fragment HogeFragment{41850420 #0 id=0xffffffff android:switcher:-1:0}
調べてみるとViewPagerにはIDを指定してあげないといけないらしい。 vp.setId( )するなりxmlの場合はちゃんとIDを指定してあげること。
vp.setId( R.id.view_pager );
( In English... ViewPager must be specified with unique ID . We should specify ID by vp.setID( ) or id attribute in XML . Like... vp.setId( R.id.view_pager ); )
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewPager vp = new ViewPager(this); setContentView( vp ); FragmentManager fm = getSupportFragmentManager(); MyAdapter fpa = new MyAdapter( fm ); vp.setAdapter( fpa ); }
そしたらこんなエラーが出た。
java.lang.IllegalArgumentException: No view found for id 0xffffffff for fragment HogeFragment{41850420 #0 id=0xffffffff android:switcher:-1:0}
調べてみるとViewPagerにはIDを指定してあげないといけないらしい。 vp.setId( )するなりxmlの場合はちゃんとIDを指定してあげること。
vp.setId( R.id.view_pager );
みたいな感じ。
( In English... ViewPager must be specified with unique ID . We should specify ID by vp.setID( ) or id attribute in XML . Like... vp.setId( R.id.view_pager ); )
IDは/values/ids.xmlに以下のように定義すると良い
( In English ... If you want to specify ID dynamically, define ID in /values/ids.xml with following. )
( In English ... If you want to specify ID dynamically, define ID in /values/ids.xml with following. )
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="view_pager" />
</resources>
2012年3月11日日曜日
MBAでdeleteとbackspaceを併用したい
MBAのDeleteキーはWindowsでのBackspaceと同じように手前の文字を消すもの。
後ろを消すための「Deleteキー」は存在しない。
でもそれは不便・・・。
webで解決策を探すと Fn+Deleteで後ろの文字を消せるとのこと。
・・・・fn+Deleteなんて不便すぎて常用できないよ ><
そこで、F12キーをDeleteキーに割り当てることにした。
弊害は以下の2点。自分には今のところ不便は無い。
1.ファンクションキーをFnキーを押さなくてもできるようにしたため、
2.F12を使うデフォルトのキーボードショートカットは使えなくなる
以下手順
- システム環境設定のキーボードを開く
- 「F1、F2などのすべてのキーを標準のファンクションキーとして使用」のチェックを外す。
- キーボードショートカット「キーボードと文字入力」の欄からDashboardを表示のチェックを外す
(その他F12キーを単独で利用しているショートカットがあれば消しておく)
- KeyRemap4MacBook をインストール
- システム環境からKeyRemap4MacBoookを開き
Change F1…F19 Key & Functional Key ( Brightness, Control, Music Control, Volume Control )
-- Change F1..F19 Key
---- Separately settings
------ MacBook Air( 2010, Late ) Style
-------- F12 to Forward Delete ←これにチェック
以上。
KeyRemap4MacBook便利ですな。
後ろを消すための「Deleteキー」は存在しない。
でもそれは不便・・・。
webで解決策を探すと Fn+Deleteで後ろの文字を消せるとのこと。
・・・・fn+Deleteなんて不便すぎて常用できないよ ><
そこで、F12キーをDeleteキーに割り当てることにした。
弊害は以下の2点。自分には今のところ不便は無い。
1.ファンクションキーをFnキーを押さなくてもできるようにしたため、
2.F12を使うデフォルトのキーボードショートカットは使えなくなる
以下手順
- システム環境設定のキーボードを開く
- 「F1、F2などのすべてのキーを標準のファンクションキーとして使用」のチェックを外す。
- キーボードショートカット「キーボードと文字入力」の欄からDashboardを表示のチェックを外す
(その他F12キーを単独で利用しているショートカットがあれば消しておく)
- KeyRemap4MacBook をインストール
- システム環境からKeyRemap4MacBoookを開き
Change F1…F19 Key & Functional Key ( Brightness, Control, Music Control, Volume Control )
-- Change F1..F19 Key
---- Separately settings
------ MacBook Air( 2010, Late ) Style
-------- F12 to Forward Delete ←これにチェック
以上。
KeyRemap4MacBook便利ですな。
EclipseでEGITを使ってBitbucektのGitリポジトリにpushする
EclipseプロジェクトをEGITを使って新規にbitbucketにpushする手順メモ
1.ローカルリポジトリを作る
- package explorer等から該当プロジェクトを右クリック
- Team -> share project を選択
- 出てくるダイアログでローカルリポジトリの場所を設定
現在のプロジェクトのフォルダを使う場合 use or create in parent folder of project.にチェックを入れる
2.ローカルリポジトリにコミット
- 該当プロジェクトを右クリック Team -> Commit を選択
- 必要なファイルをチェック -> Commit
3.リモートリポジトリの作成
- bitbucketで新たにリポジトリを作成(詳細手順は省略)
4.push to upstream の設定を行ってpushする。
- Show ViewからGit Repositryを選択してビューを表示した後、下記のようにRemotesを右クリックしてCreate Remoteを選択
- ダイアログの URIの項目でChangeを選択
- 出てくるダイアログにbitbucketのリポジトリ情報を入力
- URIに https://<ユーザー名>@bitbucket.org/<ユーザー名>/<リポジトリ名>.git と入力
このURLはbitbucketのwebsite上で各リポジトリのトップ画面に出てくる、クローンするためのURLと同じものです。
- 他の項目が自動で埋まることを確認するとともに、パスワードを入力
- host : bitbucket.org
- repository path : /<ユーザー名>/<リポジトリ名>.git
- protocol : https
- port : 空白でOK
- user : bitbuekcetのユーザー名
- password : bitbuekcetのパスワード
- OKを押して一つ前のDialogに戻った後、 Save and Pushでpush完了
2012年3月9日金曜日
Windows 8 のMetro UIのアプリを終了する(抜け出す)方法
Mac OSXからVirtualBoxでWindows 8のConsumer Previewをインストールしてみたが、Metro UIの終了方法がわからなかった。
例えばSkyDriveを起動すると下記のような画面になる(余白の黒は無視して下さい、本来は見えない部分です。)
なんとこの画面デフォルトでフルスクリーンで、✕ボタンが無いのである。
マウスでフリック風の操作をしてもダメ。
右クリックしてもコンテキストメニューらしきものが出るだけ。
しばらく色々触ってわかったことは、マウスカーソルを左下、右上に持っていけば解決できるということ。
結構判定がシビアなので気づきにくい。
↑カーソルを左下に持っていったところ。スタートメニューを表示するためのエリアがポップアップ。
↑カーソルを右上に持っていった所。メニュー(名称不明)が出る。ここからスタートボタンを押せば抜け出せる。
厳密にはアプリの終了では無いが、とりあえず抜け出せるのでOKとした。
例えばSkyDriveを起動すると下記のような画面になる(余白の黒は無視して下さい、本来は見えない部分です。)
なんとこの画面デフォルトでフルスクリーンで、✕ボタンが無いのである。
マウスでフリック風の操作をしてもダメ。
右クリックしてもコンテキストメニューらしきものが出るだけ。
しばらく色々触ってわかったことは、マウスカーソルを左下、右上に持っていけば解決できるということ。
結構判定がシビアなので気づきにくい。
↑カーソルを左下に持っていったところ。スタートメニューを表示するためのエリアがポップアップ。
↑カーソルを右上に持っていった所。メニュー(名称不明)が出る。ここからスタートボタンを押せば抜け出せる。
厳密にはアプリの終了では無いが、とりあえず抜け出せるのでOKとした。
2012年3月5日月曜日
BufferedInputStreamをStringに変換
やり方は色々あるけど、ここではCommons IOライブラリを使ったやり方を紹介。
実際のコードは以下。文字コードも指定できる。
Commons IOは以下からDL可能。
http://commons.apache.org/io/download_io.cgi
実際のコードは以下。文字コードも指定できる。
StringWriter writer = new StringWriter(); IOUtils.copy( bis, writer, "utf-8"); String theString = writer.toString();
2012年3月2日金曜日
AndroidのButtonで、タッチされたあと領域外へ行ったことを検知する。
ボタンにタッチされたあと指が領域外に移動するとAction CancelのMotionEventが発行されます。
if( event.getAction() == MotionEvent.ACTION_CANCEL ){
//ボタンの範囲外に行った
}
2012年2月24日金曜日
debug.keystore を新しくしたらパスワードが違うと怒られる。
debug.keystoreは下記のようなコマンドで作れる。
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug,O=Android,C=US
(http://magpad.jugem.jp/?eid=151より)
ここでパスワードの入力を求められるのだが、自由に設定してしまうと、下記のように怒られてしまう。
keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
実はパスワードはandroidでなければならな。
パスワードをandroidにして作りなおせばOK。
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug,O=Android,C=US
(http://magpad.jugem.jp/?eid=151より)
ここでパスワードの入力を求められるのだが、自由に設定してしまうと、下記のように怒られてしまう。
keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
実はパスワードはandroidでなければならな。
パスワードをandroidにして作りなおせばOK。
Macでエスケープ文字
Mac + Eclipse + Androidで開発していたらエスケープができなくてハマった。
簡略するとこんなコードで怒られる。
実はMacでは¥と\はちゃんと区別される。
option + ¥ で \ が打てるのである。
という訳で正解はこうなる。
ちなみに文字コード的には0x5C に円記号が、0x80 にバックスラッシュが割り当てられているとのこと。へー。
簡略するとこんなコードで怒られる。
String str = "¥"";
実はMacでは¥と\はちゃんと区別される。
option + ¥ で \ が打てるのである。
という訳で正解はこうなる。
String str = "\"";やられた。
ちなみに文字コード的には0x5C に円記号が、0x80 にバックスラッシュが割り当てられているとのこと。へー。
rawQueryでInsertできない
SQLiteDatabaseにはrawQueryというメンバがいます。
一見名前の通り指定したクエリを実行してくれるようにも思えますが、このメソッドはselect専用だそうです。
insertしたい場合はexecSQLを使いましょう。
一見名前の通り指定したクエリを実行してくれるようにも思えますが、このメソッドはselect専用だそうです。
insertしたい場合はexecSQLを使いましょう。
2012年2月21日火曜日
AndroidのNotificationでスクロールアニメを表示させる/させない
Notificationを表示させるサンプルに以下のようなものがある。
この例のように、tickerTextに値を指定するとNotificationを発生させた時に強調表示がされ、Notificationbarがスクロールしたような動きを見せたうえtickerTextで指定したテキストが表示される。
逆に言えば、これを指定しなければこのアニメーションは発生しない。
よくサンプルでtickerTextを指定するコンストラクタを使ったりするので、デフォルトでアニメ表示になっている為に困ってる人がいるかもしれない。(自分がそうだった)
そんな時はtickerTextの指定をしなければ良い。
以上
Notification notification = new Notification(); notification.icon = R.drawable.icon; notification.when = System.currentTimeMillis(); notification.tickerText = "ticker text "; // これを指定するとアニメーション発生 notificationManager.notify(R.string.app_name, notification);
この例のように、tickerTextに値を指定するとNotificationを発生させた時に強調表示がされ、Notificationbarがスクロールしたような動きを見せたうえtickerTextで指定したテキストが表示される。
逆に言えば、これを指定しなければこのアニメーションは発生しない。
よくサンプルでtickerTextを指定するコンストラクタを使ったりするので、デフォルトでアニメ表示になっている為に困ってる人がいるかもしれない。(自分がそうだった)
そんな時はtickerTextの指定をしなければ良い。
以上
Android の Marketアプリを手動でアップデートする。
※自己責任でお願いします。
M7003Bのマーケットで表示されるアプリが激減して困っていた。
ほんと数える程しか無い状態に・・・。
マーケットが古いのが気になっていたのでアップデートしたらなんとかなるのではないかと思ってやってみた。
端末で単にapkをDLしてインストールしようとしてもダメ。
「インストールは完了していません」と表示されて失敗する。
そこで試した手順は以下。
/system/appにぶち込みます。
※要rootです。また、ADBは導入済みとします。
1.以下のリンクからapkをDL
http://www.mediafire.com/?vdocx41t37rnn6y
2.念のため既存のマーケットapkをバックアップ
$ adb shell
$ mv /system/app/Vending.apk <backup dir>
3.DLしたapkを/system/appにぶちこむ。
> adb push com.android.vending-1.apk /system/app/Vending.apk
以上
M7003Bのマーケットで表示されるアプリが激減して困っていた。
ほんと数える程しか無い状態に・・・。
マーケットが古いのが気になっていたのでアップデートしたらなんとかなるのではないかと思ってやってみた。
端末で単にapkをDLしてインストールしようとしてもダメ。
「インストールは完了していません」と表示されて失敗する。
そこで試した手順は以下。
/system/appにぶち込みます。
※要rootです。また、ADBは導入済みとします。
1.以下のリンクからapkをDL
http://www.mediafire.com/?vdocx41t37rnn6y
2.念のため既存のマーケットapkをバックアップ
$ adb shell
$ mv /system/app/Vending.apk <backup dir>
3.DLしたapkを/system/appにぶちこむ。
> adb push com.android.vending-1.apk /system/app/Vending.apk
以上
登録:
投稿 (Atom)