そのため、私のアプリケーションでは、ある時点で大量の画像を一時フォルダーに保存し、それらをすぐにギャラリーに表示したいと考えています。再起動からは、そうしますが、それ以外の場合はしません。
SendBroadcastメソッドを使用してみました:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
しかし、私は許可エラーを受け取ります:
E/AndroidRuntime( 2628): Java.lang.SecurityException: Permission Denial: not allowed to send broadcast Android.intent.action.MEDIA_MOUNTED from pid=2628, uid=10068
AndroidManifestで権限が不足している可能性がありますか、それともサポートされなくなりましたか?ありがとう
別の答え でPetrusが提供するコードは、KitKat(4.4)で動作します。
MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { /* * (non-Javadoc) * @see Android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(Java.lang.String, Android.net.Uri) */ public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } });
Environment.getExternalStorageDirectory().toString()
を試しましたが、カスタムフォルダーが見つかりませんでした。
私はこの問題を解決するために私の経験を共有したかっただけです。
最後に、一度に1つのファイルをスキャンするようにMediaScannerConnection
を構成しましたが、これらの画像を保持していたフォルダーが表示されなくなりました。各画像をダウンロードするたびに、MediaScannerConnection
とファイルパスをフォルダー自体ではなくUriとして呼び出しました。
また、なぜsendBroadcast
はKitKatでの作業を中止するのかと尋ねたところ、sendBroadcast
が悪用され、何度も呼び出されたため、システムの電池が消耗したり、速度が低下したりしたため、理にかなった虐待を防ぐ。すべての画像を保持するフォルダーに上記のソリューションを使用することを望んでいましたが、フォルダーでは機能しませんでした。フォルダーを見つけるとカスタムフォルダー内の残りのファイルが公開されることを期待していましたが、私の場合はそうではありませんでした。将来はもっと良い答えを見つけたいと思っています...
これが私のコードのスニペットです。
MediaScannerConnection.scanFile(ApplicationContext.context, new String[] { imageFile.getPath() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
Log.i(TAG, "Scanned " + path);
}
});
これを試してください:ファイルをフォルダーに保存した後、以下のコードを記述してください
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
以下のコードは、画像を保存した後にギャラリーを更新するためのすべてのデバイスを機能させます。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f1 = new File("file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
Uri contentUri = Uri.fromFile(f1);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
} else {
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
私は遅いことを知っていますが、これを試してすべてのバージョンで機能することができます:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
Intent mediaScanIntent = new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(out); //out is your file you saved/deleted/moved/copied
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
} else {
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
}
MediaScannerConnectionClient を実装し、以下のコードを追加します。4.4で完全に機能します:)
MediaScannerConnection conn;
public void startScan(String url) {
imagepath = url;
if (conn != null)
conn.disconnect();
conn = new MediaScannerConnection(activity.this, activity.this);
conn.connect();
}
@Override
public void onMediaScannerConnected() {
try {
conn.scanFile(imagepath, getMimeType(imagepath));
} catch (Java.lang.IllegalStateException e) {
//Do something
}
}
@Override
public void onScanCompleted(String path, Uri uri) {
conn.disconnect();
}
SendBroadcastの代わりにMediaScannerConnectionを使用します。
MediaScannerConnection.MediaScannerConnectionClient(
{
@Override
public void onScanCompleted(String path, Uri uri) {
if (path.equals(**your filename**.getAbsolutePath()))
{
Log.i("Scan Status", "Completed");
Log.i("uri: ",uri.toString());
conn.disconnect();
}
}
@Override
public void onMediaScannerConnected()
{
// TODO Auto-generated method stub
conn.scanFile(**your file name**.getAbsolutePath(),null);
}
});
conn.connect();
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
//Gallery Refresh Code
MediaScannerConnection.scanFile(getActivity(), new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() {
/*
* (non-Javadoc)
* @see Android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(Java.lang.String, Android.net.Uri)
*/
public void onScanCompleted(String path, Uri uri)
{
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
out.close();