2016/02/14
AdView は動的追加にしないとメモリリークする
AdView まわりが参照を握っている様子。こういう時の常套手段として、
AdView しかないアプリを作って動作を確認してみることにしました。プログラム全般、無節操に手を出しまくってみる
AdView まわりが参照を握っている様子。AdView しかないアプリを作って動作を確認してみることにしました。
android.permission.WRITE_EXTERNAL_STORAGE と android.permission.READ_EXTERNAL_STORAGE は許可を動的に取得してもすぐに反映されないので注意が必要です。sdcard_rw というグループへのアクセス許可があるかどうかを Linux Kernel が判断しています。そして、実行中のプロセスに関しては設定が反映されませんAndroid OS の動作が今後変わる可能性はありますが。onResume など使用する直前にパーミッションを確認します。
@Override
protected void onResume() {
super.onResume();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_PERMISSIONS_WRITE_EXTERNAL_STORAGE);
}
}
WRITE_EXTERNAL_STORAGE への許可がない場合、以下のようにユーザへ許可を求めるダイアログが表示されます。onRequestPermissionsResult で返ってくるので、対応を決めます。一般的なパーミッションだとそのまま処理を続行することになりますが、Storage 系のパーミッションの場合、以下のように アプリの再起動をして設定を反映させますActivity ではなくアプリプロセスの再起動が必要です。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_PERMISSIONS_WRITE_EXTERNAL_STORAGE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 許可された場合
// 設定を反映させるためにアプリを再起動
Intent activityIntent = new Intent(this, ThisActivity.class); // 自Activity を指定
int pendingIntentId = 1;
PendingIntent pendingIntent = PendingIntent.getActivity(this, pendingIntentId, activityIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager)getSystemService(ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
System.exit(0);
} else {
// 許可されなかった場合
// TODO エラーメッセージを表示して Activity を終了させる等
}
break;
default:
// Do nothing
break;
}
}
アプリケーション開発から組み込みまで手を出しているフリーランスのエンジニア
何故か C,C++ の仕事をすることが多いけど、本当は Java や C# が好き
最近は Android がらみ多し