Memo/Android/sdk

http://dexlab.net/pukiwiki/index.php?Memo%2FAndroid%2Fsdk
 

Android SDK

  • http://market.android.com/publish から登録。
    • $25.00 クレジットカードのみ
    • 登録時の電話番号: 011-81-3-xxxx-xxxx
    • 販売用の銀行口座を登録 > デポジット確認(5日後)

ライブラリ


機種依存


Google Playからアプリ情報の取得

APIが提供されていないので、Webスクレイピングしか方法が無いようだ。
Android market用として提供されたものも使えそう。

  • 問題点
    • Google Play側の画面が変更された場合に取得できなくなる
    • 価格がIPアドレスによって変わる(日本のIPなら円)
  • Google Play のランキングとかレビューとかを取得する - 勤務先と無関係なことを書く日記 perl製
    1. perl -MCPAN -e 'install Module::Pluggable'
    2. perl -MCPAN -e 'install Test::Pod'
    3. perl -MCPAN -e 'install Data::Dumper'
    4. perl -MCPAN -e 'install List::Util'
    5. perl -MCPAN -e 'install Time::HiRes'
    6. perl -MCPAN -e 'install Compress::Raw::Zlib'
    7. perl -MCPAN -e 'install Module::ScanDeps'
    8. perl -MCPAN -e 'install Module::Install'
    9.  
    10. perl -MCPAN -e 'install Test::Fatal'
    11. perl -MCPAN -e 'install HTML::TreeBuilder::LibXML'
    12. perl -MCPAN -e 'install Web::Scraper'
    13. perl -MCPAN -e 'install LWP::Protocol::https'
    14.  
    15. git clone https://github.com/higemaru/p5-www-googleplay-scraper.git
    16. cd p5-www-googleplay-scraper
    17. perl Makefile.PL
    18. make
    19. sudo make install
  • android_market_api Ruby製。Android Market 時代のものなので取得できない項目がある。説明等は取得できた

解像度の違いの対応


カメラ

Androidエミュレーター x86版を使う

emu403-x86.jpg

  • 2.3.3と比べて違った点
    • AVDで「GPU emulation:yes」を追加すると早い。デフォルトはno
    • Intel VT CPUならWindows, MacOSX対応。AMD-VはLinuxのみ対応
    • クリック音等がちゃんと出る
    • 日付と時刻の自動設定が有効
    • 日本語IMEが使える
  • Eclipseで「This Android SDK requires Android Developer Toolkit version 17.0.0 or above」エラーが出る場合、ADTのアップデートが必要
  1. ヘルプ > 新規ソフトウェアのインストール
  2. ロケーション:https://dl-ssl.google.com/android/eclipse
  3. 全てチェックしてインストール
  1. Eclipseのメニュー > ウィンドウ > Android SDK Manager
  2. Android 4.0.3 (API 15) > Intel x86 Atom System Imageにチェック
  3. Extras > Intel Hardware Accelerated Execution Manager にチェック
  4. 「Install X packages」でインストール。数十分かかる
  • Intel VT対応CPUの場合(AMD-VはLinuxのみ対応)
    • windowsの場合
      • extras\intel\Hardware_Accelerated_Execution_Manager\IntelHaxm?.exe を実行
    • macの場合
      • extras/intel/Hardware_Accelerated_Execution_Manager/IntelHAXM.dmg を開き、インストール
  1. Android 4.0.3 x86用のエミュレータを追加
  2. Eclipseのメニュー > ウィンドウ > AVD Manager
  3. 新規
    • 名前:適当
    • ターゲット:Android 4.0.3
    • CPU:Intel Atom(x86)
    • 解像度:適当「WVGA800」
    • Snapshot:使用可能 はチェックしない(GPUと併用できない)
    • ハードウェア:新規 > GPU emulation > yesに変更
  1. 既存プロジェクトの変更
  2. 該当プロジェクトを選択 > 右クリック > 実行 > 実行の構成
  3. ターゲットタブで先ほど作成した「4.0.3」にチェックを押し、適用
  4. あとは普通にプロジェクトを実行
  5. 初回のエミュレータ起動はやたら遅いので注意
  6. 設定 > Language
    • 日本語
    • 日本語IME
  7. 設定 > 日付と時刻
    • タイムゾーンを自動設定のチェックを外す
    • 日本標準時(東京)に変更
  • eclipseのコマンドラインに追加する場合
    1. emulator -avd <avd_name> -gpu on

widget

初期フォーカスを移動

  • EditText?にフォーカスがあたって、キーボードが開いてしまい面倒な時。キャンセルボタンにフォーカスを当てる
    1. cancelButton.setFocusable(true);
    2. cancelButton.setFocusableInTouchMode(true);
    3. cancelButton.requestFocus();

EditText?等の空文字チェック

  1. EditText Height = new EditText(this); 
  2.  
  3. // NG: Height.getText().lenght() == 0
  4. // NG: Height.getText().equals("")
  5. // OK: Height.getText().toString().equals("")
  6. if ( Height.getText().toString().lenght() == 0 ) {
  7.     // 空の処理
  8. }

ADB

  • ヘルプ
    1. adb help
  • usb経由で接続は特に不要
  • wifi経由で接続。端末でadbWirelessをインストールして起動
    1. adb connect 192.168.1.x:5555
  • adb 切断
    1. adb kill-server
  • シェルを開く
    1. adb shell
  • ファイルの転送
    • ローカル > 端末のSDカードへ
      1. adb push d:\hoge.txt /sdcard/
    • 端末のSDカードからローカルへ
      1. adb pull /sdcard/hoge.txt d:\
  • アプリのインストール
    1. adb install myapp.apk
    2.  
    3. #再インストール
    4. adb install -r myapp.apk
    5.  
    6. #SDカードへインストール
    7. adb install -s myapp.apk
  • アプリのアンインストール
    1. adb uninstall com.example.myapp
    2.  
    3. # data, cacheは保持
    4. adb uninstall -k com.example.myapp

Preference(設定画面)

設定画面などの保存に利用される。永続データ保存方法の一つ。1プリファレンス=1 XMLファイルとして、key,valueが保存される。
デフォルトのプリファレンスは常にMODE_PRIVATEで、1アプリ1個以上のプリファレンスを保存できる。

  • デフォルトプリファレンス
    1. // package com.example.myapp;
    2. SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    3.  
    4. // 任意のプリファレンス名を指定できるが、デフォルトプリファレンスを取得する場合
    5. SharedPreferences prefs = getSharedPreferences("com.example.myapp_preferences", MODE_PRIVATE);
    • 保存したデータの確認:eclipse > 左上の「+」アイコン > DDMS > ファイルエクスプローラ > ファイル指定 > 右上の「pull 〜」でxmlを取り出せる
      data/data/com.example.myapp/shared_prefs/com.example.myapp_preferences.xml
  • 他のアプリのプリファレンスの取得(MODE_WORLD_READABLE|MODE_WORLD_WRITEABLEが指定されている場合のみ)
    1. String str;
    2. try{
    3.   Context context = createPackageContext("パッケージ名",0);
    4.   SharedPreferences prefs =
    5.   context.getSharedPreferences("プリファレンス名",MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);
    6.   str = prefs.getString("key",""));
    7. }catch (NameNotFoundException e){
    8.   e.printStackTrace();
    9. }
  • 設定一括削除
    1. SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); // または getSharedPreferences("キー", MODE_PRIVATE).edit();
    2. editor.clear().commit();

エラー送信

static変数

  • Application,Contextが必要な場合はアプリケーション終了まで存在する値を使う
    1. // Context.getApplicationContext()
    2. // Activity.getApplication()
    3.  
    4. public static Context context;
    5. public void onCreate(Bundle savedInstanceState){
    6.     context = getApplicationContext();
    7. }
  • BACKやホームボタンでホーム画面に移動しても、実際には Activity が終了しただけで、アプリのプロセスと static変数はメモリに残っている。
  • ホーム画面移動 > またアプリ起動で、メモリ不足等でActivityのメンバ変数はstaticであっても初期化される場合がある
  • onDestroy()してもActivityが終了するだけで、プロセスは死んでいないので再実行時にstatic変数が初期化されるとは限らない(縦横持ち替えでもonDestroyが発生)
  • static変数をアプリ起動〜終了までの永続的キャッシュとして使用できない
  • 永続的データとしては、PreferenceManager?, SharedPreferences?を使う
  • static final(定数化)や、staticイニシャライザーの利用で、クラスロード時にある程度データの再構築は可能
    1. public static final HashMap<String, String> map = HashMap<String, String>();
    2.  
    3. static int bar=0;
    4. static{
    5.   // クラスロード時に一度だけ実行する処理を記述
    6.   bar+;
    7. }
  • singletonパターンを使う

広告

AdMob?

Intent

呼び出し元のパッケージ名、クラス名を取得

  1. String packageName = getCallingActivity().getPackageName();
  2. String className = getCallingActivity().getClassName();

連携

  • Publishing on Google Play | Android Developers
    • 「package_name」は「http://play.google.com/store/apps/details?id=com.example.myapp」の「com.example.myapp」部分
    • Google Play 検索
      1. // 文字指定
      2. Uri uri=Uri.parse("market://search?q=検索文字");
      3. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
      4. startActivity(intent);
      5.  
      6. // アプリ指定(一つしか出ないはず)
      7. Uri uri=Uri.parse("market://search?q=pname:com.example.myapp");
      8.  
      9. // 開発者指定
      10. Uri uri=Uri.parse("market://search?q=pub:開発者名");
    • Google Play アプリ詳細
      1. Uri uri=Uri.parse("market://details?id=com.example.myapp"); // GMAIL例 com.google.android.gm
      2. Intent intent = new Intent(Intent.ACTION_VIEW, uri);
      3. startActivity(intent);
    • Google Play アプリアンインストール
      1. Uri uri = Uri.fromParts("package","com.example.myapp",null);
      2. Intent intent=new Intent(Intent.ACTION_DELETE, uri);
      3. startActivity(intent);
  • Settings | Android Developers 設定画面
    • Androyer in Japan: 本体設定の画面を表示する Settingsには無い設定画面を呼び出す
      1. // 言語と入力 > 入力方法の設定
      2. Intent intent = new Intent("android.settings.INPUT_METHOD_SETTINGS");
      3. startActivity(intent);
      4.  
      5. // 言語と入力 > テキスト読み上げの設定
      6. Intent intent = new Intent();
      7. intent.setClassName("com.android.settings", "com.android.settings.TextToSpeechSettings");
      8. startActivity(intent);

ワンライナー

  • クラス名の取得
    1. String classname = MyClass.class.getSimpleName(); // MyClass.class
  • パッケージ名の取得
    1. package com.example.myapp;
    2. String classname = MyClass.class.getPackage().getName(); // com.example.myapp
  • パッケージ名の取得(Contextクラス)
    1. package com.example.myapp;
    2. String packagename = context.getPackageName(); // com.example.myapp

デバッグ

  • デバッグ環境かの判別
    1. import android.os.Debug;
    2.  
    3. if( Debug.isDebuggerConnected() ){
    4.   // デバッグ環境
    5. }
  • adbWirelessアプリでeclipseを使ってWi-Fiリモートデバッグができる
    • 実機側で上記アプリをインストール後、起動し、クリック(赤い状態)にする。adbコマンドが表示される
    • PC側で入力
      1. // 実機とwifiで接続
      2. adb connect 192.168.1.x:5555
      3.  
      4. // 実機との接続を終了
      5. adb kill-server

エミュレータ中のファイルを見る

  • eclipse > 左上の「+」アイコン > DDMS > ファイルエクスプローラ
    • デフォルトプレファレンス:data/data/com.example.myapp/shared_prefs/com.example.myapp_preferences.xml

配列とコレクションの変換


エラー

Exported service does not require permissionの警告を消す

  • AndroidManifest?.xmlのサービスタグ
    1. ...
    2. <service android:name="service SampleService" android:exported="false">
    3. ...

unknown option: --useaudio

突然エミュレーターが「unknown option: --useaudio」のエラーで起動しなくなる事がある。オプション消しても変わらない

  1. 該当プロジェクトを右クリック > 実行 > 実行の構成
  2. 該当プロジェクトの構成を削除
  3. アプリを実行すれば新規に作成されるため問題ない

Failed to install x.apk on device 'emulator-5554': タイムアウト

  • エミュレータへの接続がタイムアウトになっているようだ。デフォルト5000(5秒)
  • Eclipseのメニュー > ウィンドウ > 設定 > Android > DDMS >「ADB接続タイムアウト(ミリ秒)」に「10000」と入力し、適用

アニメーション


Spinnerでkey,valueを保持

Layout

均等割り付け

  • ボタンを等幅で横に敷き詰める(layout_width="0dp"のように同じにして、layout_weight="1"に1以上を指定)
    1.         <Button
    2.             android:id="@+id/okButton"
    3.             android:layout_width="0dp"
    4.             android:layout_height="wrap_content"
    5.             android:layout_weight="1"
    6.             android:text="@android:string/ok" />
    7.  
    8.  
    9.         <Button
    10.             android:id="@+id/cancelButton"
    11.             android:layout_width="0dp"
    12.             android:layout_height="wrap_content"
    13.             android:layout_weight="1"
    14.             android:text="@android:string/cancel" />

テーブルレイアウトの中で自動改行

  • TableLayout?の中にTextView?をいれると、折り返しが上手くいかない。「android:shrinkColumns="1"」を付与すると折り返してくれる。
    1. <TableLayout
    2. android:layout_height="wrap_content"
    3. android:layout_width="wrap_content"
    4. android:stretchColumns="1"
    5. android:shrinkColumns="1"
    6. />

Activity

  • 現在のActivityを終了し、前の画面に戻る
    1. setResult( RESULT_OK); // or RESULT_CANCELED, 戻り値が必要な場合
    2. finish();
  • 戻るキーを無効にする
    1.     @Override
    2.      public boolean onKeyDown(int keyCode, KeyEvent event) { 
    3.          if (keyCode == KeyEvent.KEYCODE_BACK) { 
    4.              return true; 
    5.          } 
    6.          return false; 
    7.      }
  • Activityのスタックをクリアして起動させる
    1. Intent intent = new Intent( this.getApplicationContext(), NextPage.class);
    2. intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
    3. startActivity( intent );
  • 「android:noHistory="true」をAndroidManifest?.xml の該当Activityに追加するとヒストリーに残らず、即終了する
    1. <activity
    2.     android:name=".MyAppActivity"
    3.     android:label="@string/app_name"
    4.     android:noHistory="true">

素材集

Androidエミュレータの設定

正しく設定していないと、「DNSが引けずにネットに繋がらない」「時計が狂っていてWebサービス系APIでエラーが出る」等々が発生する

  • menu > Language & keyboard > Select language > 日本語
  • menu > 日付と時刻 > 自動のチェックマークを外す(時計が狂っている場合がある)
    • タイムゾーン:GMT+9:00 日本標準時
    • 正しい日時設定を行う
  • エミュレータ上でブラウザを起動し、「www.google.co.jp」など既存サイトのDNSが引けるか確認。
    • 引けない場合DNSの設定。ルーターのDNS設定をメモしておく例「192.168.1.1」GoogleDNS「8.8.8.8」
      1. adb shell
      2.  
      3. getprop net.dns1
      4. getprop net.dns2
      5.  
      6. 空白だったり、不明なDNSの場合は事前にメモしておいたDNSを設定
      7. setprop net.dns1 192.168.1.1
    • android エミュレータのブラウザで確認
  • Androidエミュレーターを再起動すると直ることがあるので、終了 > 起動を試してみる

音を出す

  1. eclipse ウインドウ > 設定 > Android > 起動
  2. デフォルト・エミュレーター・オプションに「--useaudio」を付加

テスト

  • sciroccoUIテスト自動化ツール。Eclipseプラグイン。日本語チュートリアルあり

SDカード等へのアプリ設定保存

  • Data Storage | Android Developers
    • 以下に保存される
      /mnt/sdcard/Android/data/<package_name>/files/
    • Android 2.2(API Level 8)ではアプリのアンインストール時に上記設定ファイルも削除される

ハードウェア制御

Memo/Arduino と連動するなど。

音声合成


セキュリティ


プッシュ通知


アプリ内課金


デザイン

サンプル


NFC


サポートcodec


特定の機種のみダウンロード指定


サポート動画/音楽


デバイス依存


Android 3.0


DPI


フレームワーク


クロスプラットフォーム対応


2枚の画像を合成してファイルに出力

  • a.png + b.png = c.jpg
    1. Bitmap c = Bitmap.createBitmap(480, 320, Bitmap.Config.ARGB_8888); 
    2. Canvas offScreen = new Canvas(c); 
    3. Bitmap a = BitmapFactory.decodeFile("a.png"); 
    4. offScreen.drawBitmap(a, null, null, null); 
    5. Bitmap b = BitmapFactory.decodeFile("b.png"); 
    6. offScreen.drawBitmap(b, null, null, null); 
    7. OutputStream outputStream = new FileOutputStream("c.jpg"); 
    8. c.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 
    9. outputStream.close();

バージョン管理での除外対象

  • svn
    1. svn propedit svn:ignore .
    2. ----
    3. *.apk
    4. *.ap_
    5. *.dex
    6. *.class
    7. bin
    8. gen
    9. local.properties
    10. .classpath
    11. .project
    12. .settings
    13. ----

AR


添付ファイル: fileemu403-x86.jpg 492件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-03-20 (火) 12:52:29 (97d)