在Lollipop上的Android图库中显示图片文件

时间:2015-04-23 12:39:00

标签: android android-5.0-lollipop android-gallery android-file android-mediascanner

我正在尝试制作一些在应用程序中可见的图片(因此可以在应用程序外部共享和查看),但我想将图像保留在应用程序的数据目录中因此,当应用被删除时,它们会被删除(因此它们存储在“{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广播的解决方案都是无用的。

5 个答案:

答案 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")));