デバッグビルド時だけ Permission Denial: starting Intent が発生するなぁと思ったら確認する事
デバッグビルドとリリースビルドを併用しようと applicationIdSuffix に .debug をつけた頃から設定画面からのアクティビティ呼び出しが失敗するようになった。
デバッグビルドとリリースビルドを併用する為に書いた記述
android { // ... buildTypes { debug { applicationIdSuffix ".debug" } }
エラーログ
java.lang.SecurityException: Permission Denial: starting Intent { cmp=info.justaway/.MuteActivity } from ProcessRecord{430cc048 31038:info.justaway.debug/u0a171} (pid=31038, uid=10171) not exported from uid 10167
設定画面からアクティビティを呼び出すための記述
<PreferenceScreen android:key="mute" android:title="@string/pref_title_notification"> <intent android:action="android.intent.action.MAIN" android:targetPackage="info.justaway" android:targetClass="info.justaway.NotificationSettingsActivity"/> </PreferenceScreen>
エラーログを見るとどうも動作しているアプリのパッケージが info.justaway.debug なのに android:targetPackage が info.justaway のままなのが原因らしい
面倒だがデバッグ時だけ targetPackage が info.justaway.debug になるように様に書き換え
<PreferenceScreen android:key="mute" android:title="@string/pref_title_notification"> <intent android:action="android.intent.action.MAIN" android:targetPackage="@string/android_package_name" android:targetClass="info.justaway.NotificationSettingsActivity"/> </PreferenceScreen>
以下の様な文字列リソースを用意し事なきを得た。
main/res/values/strings.xml
<string name="android_package_name" translatable="false">info.justaway</string>
debug/res/values/strings.xml
<string name="android_package_name" translatable="false">info.justaway.debug</string>
translatable="false" の記述は言語環境でリソースを分けない事を明示する、values-ja/strings.xmlなど対応する言語環境用のリソースを用意している場合、「"values-ja/strings.xml"にも"android_package_name"居るんじゃないですか??」みたいな警告が出てうざい上、記述すると今度はdebug/res/側でもvalues-ja/strings.xmlを用意しないといけなくなるので注意が必要