我正在尝试制作一些在应用程序中可见的图片(因此可以在应用程序外部共享和查看),但我想将图像保留在应用程序的数据目录中因此,当应用被删除时,它们会被删除(因此它们存储在“{sdcard} / Android / data / {appID} / Pictures / {subfolder} /”)。
我已经查看了很多答案,对于旧版本的Android,以下两种解决方案都有效,但它们在Lollipop中似乎不起作用:
MediaScannerConnection.scanFile(this,
new String[]{file.toString()}, new String[] { "image/jpeg" },
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
Uri contentUri = Uri.fromFile(file);
Intent mediaScanIntent = new
Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,contentUri);
sendBroadcast(mediaScanIntent);
我在Nexus 4(Android 5.0.1)和Nexus 6(Android 5.1)中对此进行了测试,但它无效。在Nexus 7(Android 4.2.2)中,它确实有效。所有3个设备在 {sdcard} / Android / data / 文件夹中都有一个“.onmedia”文件,因此没有正常的媒体扫描应该选择它们...
有没有人知道如何让它在所有设备/ Android版本上运行?这应该是因为noMedia文件首先不起作用,并且Lollipop是唯一能够正确执行此操作的版本吗?
编辑:请注意,即使重新启动手机(也应该触发重新扫描文件)也不起作用。并且有充分理由因为这些文件位于“.nomedia”目录的子文件夹中...所以任何包含MEDIA_MOUNTED广播的解决方案都是无用的。
答案 0 :(得分:8)
尝试以下代码。它在 Lollipop 为我工作,希望为你工作
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA,"file path");
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
mContext.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);
编辑:不要忘记将它添加到你的清单中(尽管在Lollipop中它不再是必需的):
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
答案 1 :(得分:2)
我建议你看看my answer here。它结束了我所做的MediaScanner
周围的所有发现。
附注:所有KitKat
问题似乎也都贴在Lollipop
上。
答案 2 :(得分:0)
如果媒体内容提供商将获得包含图像的本地数据目录的读取权限,那么我并不感到害羞。如果没有权限,您的图库无法使用。
要了解是否可以通过
尝试将本地图像引用到orroids媒体数据库中。 mMediaProvider = mContext.getContentResolver().acquireProvider("media");
mImagesUri = Images.Media.getContentUri(volumeName);
result = mMediaProvider.insert(mImagesUri, values);
以下是媒体扫描程序的源代码,其中应包含如何从jpg中填充值的所有必要代码片段
答案 3 :(得分:0)
保存图像后,调用扫描方法扫描图库,它将在图库中显示图像。
scanFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/appfolder/imgname"+imagenumber+".png");
private void scanFile(String file) {
MediaScannerConnection.scanFile(this,
new String[] { file.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
}
答案 4 :(得分:0)
正如您所说 {sdcard} / Android / data / 文件夹包含.nomedia文件,我们可以发送MediaScanner
广播来扫描文件夹的子文件夹其中包含.nomedia文件,方法是使用波纹管代码指定子文件夹路径。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file:// "+"Directory path")));