Memo/Android/sdk

https://dexlab.net:443/pukiwiki/index.php?Memo/Android/sdk
 

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製
    perl -MCPAN -e 'install Module::Pluggable'
    perl -MCPAN -e 'install Test::Pod'
    perl -MCPAN -e 'install Data::Dumper'
    perl -MCPAN -e 'install List::Util'
    perl -MCPAN -e 'install Time::HiRes'
    perl -MCPAN -e 'install Compress::Raw::Zlib'
    perl -MCPAN -e 'install Module::ScanDeps'
    perl -MCPAN -e 'install Module::Install'
    
    perl -MCPAN -e 'install Test::Fatal'
    perl -MCPAN -e 'install HTML::TreeBuilder::LibXML'
    perl -MCPAN -e 'install Web::Scraper'
    perl -MCPAN -e 'install LWP::Protocol::https'
    
    git clone https://github.com/higemaru/p5-www-googleplay-scraper.git
    cd p5-www-googleplay-scraper
    perl Makefile.PL
    make
    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のコマンドラインに追加する場合
    emulator -avd <avd_name> -gpu on

widget

初期フォーカスを移動

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

EditText等の空文字チェック

EditText Height = new EditText(this); 

// NG: Height.getText().lenght() == 0
// NG: Height.getText().equals("")
// OK: Height.getText().toString().equals("")
if ( Height.getText().toString().lenght() == 0 ) {
    // 空の処理
}

ADB

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

Preference(設定画面)

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

  • デフォルトプリファレンス
    // package com.example.myapp;
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    
    // 任意のプリファレンス名を指定できるが、デフォルトプリファレンスを取得する場合
    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が指定されている場合のみ)
    String str;
    try{
      Context context = createPackageContext("パッケージ名",0);
      SharedPreferences prefs =
      context.getSharedPreferences("プリファレンス名",MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);
      str = prefs.getString("key",""));
    }catch (NameNotFoundException e){
      e.printStackTrace();
    }
  • 設定一括削除
    SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); // または getSharedPreferences("キー", MODE_PRIVATE).edit();
    editor.clear().commit();

エラー送信

static変数

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

広告

AdMob

Intent

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

String packageName = getCallingActivity().getPackageName();
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 検索
      // 文字指定
      Uri uri=Uri.parse("market://search?q=検索文字");
      Intent intent = new Intent(Intent.ACTION_VIEW, uri);
      startActivity(intent);
      
      // アプリ指定(一つしか出ないはず)
      Uri uri=Uri.parse("market://search?q=pname:com.example.myapp");
      
      // 開発者指定
      Uri uri=Uri.parse("market://search?q=pub:開発者名");
    • Google Play アプリ詳細
      Uri uri=Uri.parse("market://details?id=com.example.myapp"); // GMAIL例 com.google.android.gm
      Intent intent = new Intent(Intent.ACTION_VIEW, uri);
      startActivity(intent);
    • Google Play アプリアンインストール
      Uri uri = Uri.fromParts("package","com.example.myapp",null);
      Intent intent=new Intent(Intent.ACTION_DELETE, uri);
      startActivity(intent);
  • Settings | Android Developers 設定画面
    • Androyer in Japan: 本体設定の画面を表示する Settingsには無い設定画面を呼び出す
      // 言語と入力 > 入力方法の設定
      Intent intent = new Intent("android.settings.INPUT_METHOD_SETTINGS");
      startActivity(intent);
      
      // 言語と入力 > テキスト読み上げの設定
      Intent intent = new Intent();
      intent.setClassName("com.android.settings", "com.android.settings.TextToSpeechSettings");
      startActivity(intent);

ワンライナー

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

デバッグ

  • デバッグ環境かの判別
    import android.os.Debug;
    
    if( Debug.isDebuggerConnected() ){
      // デバッグ環境
    }
  • adbWirelessアプリでeclipseを使ってWi-Fiリモートデバッグができる
    • 実機側で上記アプリをインストール後、起動し、クリック(赤い状態)にする。adbコマンドが表示される
    • PC側で入力
      // 実機とwifiで接続
      adb connect 192.168.1.x:5555
      
      // 実機との接続を終了
      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のサービスタグ
    ...
    <service android:name="service SampleService" android:exported="false">
    ...

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以上を指定)
            <Button
                android:id="@+id/okButton"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@android:string/ok" />
    
    
            <Button
                android:id="@+id/cancelButton"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@android:string/cancel" />

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

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

Activity

  • 現在のActivityを終了し、前の画面に戻る
    setResult( RESULT_OK); // or RESULT_CANCELED, 戻り値が必要な場合
    finish();
  • 戻るキーを無効にする
        @Override 
         public boolean onKeyDown(int keyCode, KeyEvent event) { 
             if (keyCode == KeyEvent.KEYCODE_BACK) { 
                 return true; 
             } 
             return false; 
         }
  • Activityのスタックをクリアして起動させる
    Intent intent = new Intent( this.getApplicationContext(), NextPage.class);
    intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
    startActivity( intent );
  • 「android:noHistory="true」をAndroidManifest.xml の該当Activityに追加するとヒストリーに残らず、即終了する
    <activity
        android:name=".MyAppActivity"
        android:label="@string/app_name"
        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」
      adb shell
      
      getprop net.dns1
      getprop net.dns2
      
      空白だったり、不明なDNSの場合は事前にメモしておいたDNSを設定
      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
    Bitmap c = Bitmap.createBitmap(480, 320, Bitmap.Config.ARGB_8888); 
    Canvas offScreen = new Canvas(c); 
    Bitmap a = BitmapFactory.decodeFile("a.png"); 
    offScreen.drawBitmap(a, null, null, null); 
    Bitmap b = BitmapFactory.decodeFile("b.png"); 
    offScreen.drawBitmap(b, null, null, null); 
    OutputStream outputStream = new FileOutputStream("c.jpg"); 
    c.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 
    outputStream.close();

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

  • svn
    svn propedit svn:ignore .
    ----
    *.apk
    *.ap_
    *.dex
    *.class
    bin
    gen
    local.properties
    .classpath
    .project
    .settings
    ----

AR


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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:37 (91d)