カテゴリー : Android

[Android] Google Play Developer Console の「マーケティングの除外」について

Google Play Developer Console で Android アプリを申請する際に「マーケティングの除外」という項目があって、これについて調べたことをメモ。

「マーケティングの除外」の項目は、デフォルトでチェックがオフになっていて、チェックボックスの横には下記のような説明が書かれている。

Google Play と Google 所有のオンライン/モバイル サービス以外ではアプリケーションを宣伝しません。この設定への変更が有効になるまでに 60 日程度かかることについて了承します。

アプリケーションの宣伝のための露出が多い方が良いなら、未チェックのままでよさそうです。

下記の記事で詳しく考察されてます。

Androidの“マーケティングの除外”について – adsaria mood

マーケティング対象の限定

アプリのマーケティングを Google Play だけで行う場合は、次の方法で他でのマーケティングを除外できます:

Google Play デベロッパー コンソールにログインします。
スクロールして、マーケティングから除外するアプリを探します。
[価格と販売/配布地域] を選択します。
[同意事項] の下にある [マーケティングの除外] を選択します。

[引用元]:画像アセット – Android Developer ヘルプ

[Android] 正しく時刻設定してないと Twitter 認証時にエラー発生

Android アプリにて、正しく時刻設定してないと Twitter 認証時に下記のような例外が発生してしまいます。

Received authentication challenge is null
Relevant discussions can be found on the Internet at:
	http://www.google.co.jp/search?q=10f5ada3 or
	http://www.google.co.jp/search?q=e574403a
TwitterException{exceptionCode=[10f5ada3-e574403a b8c63e52-c913c2cc], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.3}

動作試験で、時刻設定を未来の時間に設定したままで、今回のようなエラーが発生しました…。

とりあえず、バグではなかったので良かったです。

[Android] Facebook 認証できないエラー : com.facebook.FacebookOperationCanceledException: remote_app_id does not match stored id

Android アプリ開発で、Facebook 認証できないというエラーが発生しました。

com.facebook.FacebookOperationCanceledException: remote_app_id does not match stored id

Facebook アプリの設定画面に登録している Key Hashes が間違っている場合、このようなエラーが発生するようです。

下記のコードを onCreate に記載して、key hash をログに出力して確認します。

try {
    PackageInfo info = getPackageManager().getPackageInfo("com.example.packagename",
            PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("YOURHASH KEY:",
                Base64.encodeToString(md.digest(), Base64.DEFAULT));
    }
} catch (NameNotFoundException e) {
 
} catch (NoSuchAlgorithmException e) {
 
}

key hash をコマンドラインで確認する方法もありますが、Windows用の OpenSSL を使わないといけないらしく、Mac用の OpenSSL だと正しい key hash が取得できないみたいです。

例えば、コマンドラインで keytool を使って debug.keystore の key hash を確認すると、 bvfSSDnrryuK8cbfekyHTs59l/A= です。

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
キーストアのパスワードを入力してください:  android
bvfSSDnrryuK8cbfekyHTs59l/A=

しかし、冒頭の方法で、アプリ実行時のログから key hash を出力させると dkgthMwGADFQ7/9fkMn4MUzpSWo= であり、こちらが正しい値です。

ややこしい話ですが、解決方法が分かって良かったです。

[参考]

Issue with Facebook Key Hashes for the Android Application – Scriptico

android – remote_app_id does not match stored id – exception – Stack Overflow

[Android] keystore ファイルの内容を確認するコマンド

Android アプリの署名ビルドに使う keystore ファイルの内容を確認するコマンドをご紹介します。

keytool -v -list -keystore  my-app.keystore

コマンドの実行結果は下記のような感じです。

キーストアのパスワードを入力してください:  
 
キーストアのタイプ: JKS
キーストアのプロバイダ: SUN
 
キーストアには 1 エントリが含まれます。
 
別名: com.my-app
作成日: 2012/12/10
エントリタイプ: PrivateKeyEntry
証明連鎖の長さ: 1
証明書[1]:
所有者: O=bakorer.com, C=JP
発行者: O=bakorer.com, C=JP
シリアル番号: 12b3389e
有効期間の開始日: Mon Nov 26 18:38:38 JST 2012 終了日: Fri Nov 20 18:38:38 JST 2037
証明書のフィンガープリント:
	 MD5:  17:74:53:02:57:DB:80:62:4A:A6:D9:5F:6B:8D:AC:F2
	 SHA1: 12:F5:85:20:58:C6:5E:45:FF:03:AB:74:8F:20:D9:89:86:D5:3F:25
	 署名アルゴリズム名: SHA1withRSA
	 バージョン: 3
 
 
*******************************************
*******************************************

文字化けするときは keytool コマンドを実行する前に、

export _JAVA_OPTIONS='-Dfile.encoding=UTF-8'

みたいな感じで、文字コードの設定をしておくと文字化けせずに済むかもしれません。

参考情報

[Android] getActionBar() で NoSuchMethodError

Android アプリ開発で、2.3 とかも動作対象端末にしたい場合、getActionBar() ではなく ActionBarSherlock の getSupportActionBar() を使うようにする。

getActionBar() を使うと NoSuchMethodError というエラーが発生してしまう。

スレッド [<1> main] (中断中 (例外 NoSuchMethodError))	
	<VM はモニター情報を提供しません>	
	TutorialActivity.onCreate(Bundle) 行: 40	
	Instrumentation.callActivityOnCreate(Activity, Bundle) 行: 1047	
	ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) 行: 1615	
	ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) 行: 1667	
	ActivityThread.access$1500(ActivityThread, ActivityThread$ActivityClientRecord, Intent) 行: 117	
	ActivityThread$H.handleMessage(Message) 行: 935	
	ActivityThread$H(Handler).dispatchMessage(Message) 行: 99	
	Looper.loop() 行: 123	
	ActivityThread.main(String[]) 行: 3691	
	Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) 行: 使用不可 [ネイティブ・メソッド]	
	Method.invoke(Object, Object...) 行: 507	
	ZygoteInit$MethodAndArgsCaller.run() 行: 864	
	ZygoteInit.main(String[]) 行: 622	
	NativeStart.main(String[]) 行: 使用不可 [ネイティブ・メソッド]

うっかりミス