コードハイライト用

せっかく無職になったから、働いてる時に忙しくて出来なかった色々な事をやってみようと場当たり的に始めたブログ。 だったけど就職決まっちゃいました。

ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2012年2月29日水曜日

[Android] MediaPlayer のエラーコード -19

MediaPlayer で再生/停止の連続コールテストしていたら変なエラーコード出た。

E/MediaPlayer(5346): error (-19, 0)

ググったらそれらしいのにはたどり着いたけど、直接的な原因が分からない。

ログを追っていたら、発生タイミングはほぼ同じで
リソース漏れしてる時こんな感じになるよなーとドキュメント読みなおしてたら

MediaPlayer削除するときに MediaPlayer.release() 呼んでなかった。

いと恥ずかしいです。

[Android] メモリの確保状況をデバッグする

GLSurfaceView を実装してテクスチャゴリゴリ書いてたら
一定の周期で画面がカクつきだした。

ググるとガベージコレクションが動作する際に処理が長時間ブロックされる、と。

ログをよく見ると確かにGCが頻繁にログをだしていたので、
こりゃいかんと eclipse でのメモリ確保状況を調べる事にチャレンジ。

以下備忘録兼ねて手順。


1.eclipseからデバッグしたいアプリを実行する


いつもの要領で。



2.DDMSパースペクティブを開く


レイアウトによりますが、とりあえずデフォルトだと右上のこいつ。



3.実行中デバイスのデバッグしたいスレッドを選択


Devices ビューに実行中のデバイス一覧が表示されています。
更にデバイスからスレッドの一覧が表示されているので、デバッグしたいスレッドを選択。
今回は「system_process」にします。



4.「Allocation Tracker」ビューの「Start Tracking」を選択


最初は何も表示されていないと思いますが、「Start Tracking」を押すと
メモリの監視が開始します。



5.「Allocation Tracker」ビューの「Get Allocations」を選択して結果を取得する


「Start Tracking」を押した以降のメモリの確保状況が出力されます。
確保されたクラス、サイズ、スレッドID、どのクラスのどのメソッドから、等かなり詳細に出ます。


更に良い事に、確保項目を選択すると、ビューの下半分に確保時のスタックトレースが表示されます。
今日はこれで大分助けられた。


今回の自分の場合は、テクスチャ描画時のコマンド引数用に
ローカル定義していた byte[] や float[] が大量にリストされており、そいつらの掃除のためにGCが頻繁に動いていました。

それらローカル変数をメンバ変数として、テクスチャ生成時から破棄時まで使いまわす形に修正したところ
目に見えてカクつきが抑えられました。ほんと良かった。

2012年2月27日月曜日

[Android][NDK] CからJavaに配列を渡して書き込んでもらう

ググってたら CallStaticByteMethod での戻り値をそのまま jbyteArray にキャストして使ってるのもあったけど
なんか怖いのでちゃんと配列の型でできないかとやってみた。

Java 側の FromC#loadFile(String filename, byte[] outBuffer) を呼び出しています。

また部分抜き出しなので不明な定義があります。(buffSize やら pBuffer やら)

// ファイル名オブジェクト生成
jstring js = charToJstring(env, pFileName);  // const char* -> jstring
// 受取り用バッファオブジェクト生成
jbyteArray ba = env->NewByteArray(buffSize);
jbyte* pArray = NULL;

if (js && ba)
{
 // クラスを取得
 jclass classObj = env->FindClass( "FromC" );
 jmethodID method = env->GetStaticMethodID(classObj, "loadFile", "(Ljava/lang/String;[B)Z");
 
 do {
  if (method == NULL) {
   LOGE( "method null" );
   break;
  }

  bool result = env->CallStaticBooleanMethod(classObj, method, js, ba);
  if (result == false) {
   LOGE( "failed loadFile" );
   break;
  }

  jboolean isCopy = JNI_FALSE;
  pArray = env->GetByteArrayElements(ba, &isCopy);
  if (isCopy == JNI_TRUE) {
   // TODO
  }

  jsize arraySize = env->GetArrayLength( ba );
  if (pArray && arraySize <= buffSize) {
   
   // 受取り用バッファにコピー
   memcpy( pBuffer, pArray, arraySize );
   
  } else {
   LOGE( "failed copy pArray:0x%08x arraySize:%d", pArray, arraySize );
  }
 } while(0);
 
 env->DeleteLocalRef( classObj );
}

env->DeleteLocalRef( js );
env->ReleaseByteArrayElements(ba, pArray, JNI_ABORT);

LOGD( "file dump %x %x %x %x %x %x %x %x %x %x", 
  pBuffer[0], pBuffer[1], pBuffer[2], pBuffer[3], pBuffer[4], pBuffer[5], pBuffer[6], pBuffer[7], pBuffer[8], pBuffer[9] );

2012年2月15日水曜日

[Android] 通知でバイブレーションさせる

デフォルトで通知出せばバイブレーションするもんだと思ったけど
そのままではダメだったのでメモ。
ソースから直接メソッド切り抜いただけですが。

/** 通知を出す */
private void setNotification( CharSequence notifyMsg, CharSequence contextMsg, Intent intent) {

 Notification notification = new Notification(R.drawable.test, notifyMsg, System.currentTimeMillis());

 PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
 notification.setLatestEventInfo(
   getApplicationContext(),
   getText(R.string.app_name),
   contextMsg,
   pIntent);

 //
 // バイブ設定
 // long の配列の場合、単位はミリ秒で {無振動, 振動, 無振動, 振動 ... } と指定する。
 // システムのデフォルトの振動方式を使用する場合は、デフォルト値を使用する旨をフラグで指定。
 // 
 //notification.vibrate = new long[] {0, 500, 0, 1000, 0};
 notification.defaults |= Notification.DEFAULT_VIBRATE;

 NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
 nm.notify(1111, notification);
}

2012年2月4日土曜日

[Android] SDK4.0でDesireのUSBドライバがインストール出来なかった

1年ぶりくらいに書く記事として適切か微妙な気がしましたが、
最近会社にAndroid環境を作るときに引っかかった事をメモ。

--------------------------------

以前のSDKではそんなことはなかった気がするけど
SDK4.0に同梱されるUSBドライバには、HTC-Desire用のドライバ記述が足りていないようです。

\android-sdk\extras\google\usb_driver\
android_winusb.inf

上記設定ファイル内の

  • [Google.NTx86]セクション
  • [Google.NTamd64]セクション

それぞれに次の内容を追加します。
; HTC Desire
%SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&MI_01
こちらのページを参考にさせて頂きました。
http://3oclock.com/hello-world/2010/04/htc-desire-usb-driver.html

2010年11月2日火曜日

[Android] 手探りタブメニュー 前編

前回のAndroid記事では忘れていましたが、開発環境は 
Eclipse 3.5 Galileo
Android 1.6, API4, revision3
です。
------------------------------------

今度はタブを使ったメニューで引っかかりました。

とりあえず、順を追って二つのタブが存在するタブメニューを作ってみます。

2010年10月29日金曜日

[Android]画面の上下スクロール

Android関連です。

アプリ作ってて初歩の初歩で引っかかってしまったのでメモ。

1画面に収まり切らないサイズの View を配置した場合、出来れば Layout の種類に関わらず
自動でスクロールできれば嬉しいですが、そういう訳でもありません。

スクロールさせたい View, Layout は、「ScrollView」以下に配置する必要があります。

eclipse 上で製作する場合、デフォルトでは LinearLayout が一個置かれているので、
その下に置いてしまいましょう。

アウトラインはこんな感じ









また、画面全体をスクロールエリアとする為に
ScrollView の「Layout height/width」プロパティを fill_parent にすると良いと思います。

後は、画面をスライドした時に動かしたい View を、ScrollView 以下にぽんぽん置いていきます。

------------------------------------

画面全体ではなく、例えば画面の下半分のみスクロールしたい、と言う場合は
以下の様に Layout を配置します。
LinearLayout07 と、ScrollView01 の「Layout width」プロパティに同じ値を設定します。
(1でも100でもお好みでOKです。)

実際にやってみたのが以下の画面です。
画面の中心から下がスクロールしているのが確認できると思います。



スクロール関連の備忘録でした。

2010年10月26日火曜日

[Android]謎エラー

たまにはプログラムの話もしよう。

Androidの開発をしていて、エミュレータでさぁ実行!と思ったらよく下記のエラーが発生します。

Failed to upload XXXX.apk on device 'emulator-5554'
java.io.IOException 発生: Unable to upload file: Local file doesn't exist.
Launch canceled!

emulator-5554に実行ファイル(apkファイル)をアップしたいけど
apkファイルがねーよ、と。そういう旨のエラーです。

------------------------------------

一瞬、え?となりますが、これは実際正しいことを言っていて
確かに該当プロジェクトフォルダのbinフォルダを見てみると、apkファイルがありません。

恐らくデフォルトの設定では、
プロジェクト(P)->自動的にビルド にチェックが入っており、
ファイルを保存する度にビルドが行われ、常にapkがある状態になるはずです。

じゃなんでapkファイル無いのさ?と言う話なんですが・・・。
調べてみたところ、私の環境で発生する条件は見つかりました。
ややこしいのですが、別のエラーと絡んでいます。

エラーに至る経緯、細かく書くと長いのでざっくりと
---------------------------------------------------------------------------
1.main.xmlを編集
2.確認するために実行
3.実行対象が main.xml のまま実行しようとしてしまう
4.main.out.xml というファイルが出来てしまってエラー
 ※ res\layout\main.xml:0: ERROR Resource entry main is already defined.とか出ます
5.一度発生してしまうと、main.out.xmlを削除しない限り同様のエラーで実行できない
---------------------------------------------------------------------------
と言う感じです。
(strings.xml でも同様に発生します。メッセージは違いますが)

エラーを出してしまうとapkが消えてしまいます。

エラーを解消する為に main.out.xml を削除しても
「ファイルを保存」していない為、自動的にビルドのオプションが働かず、結果的に
実行ファイルが無いという状態になってしまっていました。

一応の解決法は、
ソースでもちょっと改変(Enter⇒BSとか)して上書き保存すれば改めてビルドされるので
それでapkファイルは生成され、通常通り動くようになります。
もしくはビルドを常に手動で・・・っていう感じでしょうか?

------------------------------------

エラーで検索したけど意外と引っかからなかったので、メモがてら。
もしかして超当たり前な話なのかも。