こものAndroidメモ

Androidアプリの開発メモブログ!!

Android4.4でメディアマウント時に落ちた時の回避方法 —

端末のアップデートでAndroid 4.4にすると、
昔作っていたカメラアプリが画像保存時に強制終了するようになりました。
 

会社勤め時代に作ったアプリなので、今はもう手元にソースコードはありませんが、
アプリ自体は普段から使っているので大変困りました。
 

なので、後任者の方に直してもらいたいと思い、原因の調査に乗り出してみました。
 

強制終了時にLogCatで確認したら、下記のエラーが出ていました。
 

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=XXXXX, uid=XXXXX
 
 

むむむっ。どうやらAndroid 4.4からメディアをマウントするためのBroadcastの送信が使えなくなったみたいですね。
Android 4.3端末では正常に動いていました。
 

画像ファイルを外部ストレージに保存する場合、物理的に保存するだけではギャラリーアプリなどが認識してくれないので、
下記のようにマウントのBroadcastを送信してギャラリアプリに認識させていました。
 

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
    Uri.parse ("file://" + Environment.getExternalStorageDirectory())));

 

ずいぶん昔の話ですが、当時はギャラリーアプリが認識してくれる魔法のコードとして、
どこかのサイトで紹介されていたのをそのまま使っていたのをふと思い出しました。

それがどうやらAndroid 4.4から使えなくなったみたいです。
 
 

対策として、メディアをマウントし直すのではなく、MediaScannerConnectionを使って
保存したファイルをMediaContentProviderに登録(スキャン)する方法なら回避できるみたいです。

テストコードを書いたところ、ギャラリーアプリなどにすぐに反映されるのも確認しました。
 

String[] filePath = {targetFIleName};
String[] mimeType = {"image/*"};
MediaScannerConnection.scanFile(context, filePath, mimeType, null);

 

アプリを作った当時からこのコードを書けていたら、今頃こんな調査は必要なかったのでしょうが……(^^;;
 



Categorised as: ストレージ関連



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です