小编joa*_*imk的帖子

无法在 Android 10 上更新 MediaStore

我一直在通过 ContentResolver 更新 MediaStore 中的元数据,但这不再适用于 Android Q (API 29)。下面的代码给了我一个警告,并且描述没有更新:

ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DESCRIPTION, "Some text");

int res = getContext().getContentResolver().update(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
        values,
        MediaStore.Images.Media._ID + "= ?", new String[]{sImageId});
Run Code Online (Sandbox Code Playgroud)

android.process.media W/MediaProvider:忽略来自 com.example.android.someapp.app 的描述突变

这篇 Medium 文章描述了 Google 如何更改用于访问和更新文件的 API,但是仅更新元数据呢?该警告似乎告诉我 Google 不再希望允许第三方应用使用 MediaStore,而且我还找到了警告的来源:https//android.googlesource.com/platform/packages/providers/MediaProvider/+/ master/src/com/android/providers/media/MediaProvider.java#2960

有谁知道为什么此更新不适用于 Android 10,正确的解决方法是什么?

android mediastore android-10.0

8
推荐指数
1
解决办法
3633
查看次数

查询MediaStore:加入缩略图和图像(在ID上)

我正在开发适用于Android的"照片库"型应用.它最初是Udacity开发Android应用程序的最终项目,所以它的整体结构(活动,内容提供商等)应该非常合理,并且Udacity/Google接受了认证.

然而,它仍然没有100%完成,我仍然在努力改进它.

我想要做的应该是非常直截了当的; 将设备上的所有图像(作为缩略图)加载到MainActivity中的GridView中,使用DetailActivity显示完整大小的图像+一些元数据(标题,大小,日期等).

该课程要求我们编写一个ContentProvider,所以我有一个query()函数,它基本上从MediaStore中获取数据,并将光标返回给MainActivity的GridView.在我的设备上,至少,(索尼Xperia Z1,Android 5.1.1)这几乎完美.有一些错误和怪癖,但总的来说,我可以在我的应用程序中不断找到手机上的所有图像,然后单击它们查看详细信息.

但是,当我尝试在朋友的索尼Xperia Z3上安装应用程序时,一切都失败了.没有图像显示,虽然我明显检查他的手机上实际上有~100张照片.在另一个朋友的手机(全新的三星S6)相同:-(

这是主要问题.在我的手机上,当东西工作时,"次要"错误涉及当相机拍摄新照片时,它不会自动加载到我的应用程序中(作为缩略图).我似乎需要弄清楚如何触发扫描,或者加载/生成新拇指所需的任何内容.我的愿望清单上的这一点也很高.

正如我所说,我相信所有这一切都应该非常简单,所以也许我所有的困难都表明我正以完全错误的方式解决问题?这是我的query()函数正在做的事情:

  1. 从中获取所有缩略图的光标 MediaStore.Media.Thumbnails.EXTERNAL_CONTENT_URI

  2. 从中获取所有图像的光标 MediaStore.Media.Images.EXTERNAL_CONTENT_URI

  3. 加入这些,MediaStore.Media.Thumbnails.IMAGE_ID = MediaStore.Media.Images._ID使用aCursorJoiner

  4. 返回结果retCursor(在连接中生成)

- 请在上一篇文章中找到完整的代码.

虽然这看起来是正确的(对我来说),也许真的不是这样的方法吗?顺便说一句,我正在加入大拇指和图像,这样我就可以在GridView中显示一些元数据(例如,拍摄日期)和缩略图.我已经确定了加入的问题,特别是因为如果我简化这个只是将大拇指加载到GridView中,那么一切正常 - 也在我朋友的手机上.(除了加载新照片.)

不知怎的,我的假设IMAGE_ID_ID始终一致是不正确的?我在AirPair上看过一篇文章,描述了一个类似的画廊应用程序,那里的教程实际上与此略有不同.他没有尝试加入游标,而是获取缩略图光标并对其进行迭代,使用单个查询将图像中的数据添加到MediaStore ......但这是最有效的方法吗?- 尽管如此,他的解决方案确实将缩略图连接到ID上的相应图像:

Cursor imagesCursor = context.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
            filePathColumn, 
            MediaStore.Images.Media._ID + "=?", new String[]{imageId},  // NB!
            null);
Run Code Online (Sandbox Code Playgroud)

总之,我需要以下方面的帮助:

  • 我正确查询MediaStore吗?
  • 在ID上加入大拇指和图像是否安全 - 这是否会一直稳定/同步?
  • 我的应用程序如何自动生成/获取新图像的缩略图?

android mediastore

7
推荐指数
2
解决办法
2550
查看次数

无法在 Android 10 上读取缩略图 (loadThumbnail)

我正在通过查询 MediaStore 从设备读取缩略图,使用MediaStore.Images.Thumbnails.getThumbnail(). 但是,这在 Android 10 (API 29) 中已被弃用,并指向ContentResolver#loadThumbnailhttps : //developer.android.com/reference/android/provider/MediaStore.Images.Thumbnails

但是,我无法让它工作(在运行 API 29 的模拟设备中)。我已将一些 JPEG 复制到模拟设备上,最终位于下载文件夹中。它们在照片应用程序中显示良好。下面的代码给了我一个 FileNotFoundException。“无内容提供者”实际上告诉我什么?

try {

    Size thumbSize = new Size(100, 100);
    Uri thumbUri = Uri.fromFile(new File(imgPath));
    // imgPath: /storage/emulated/0/Download/pexels-photo-323490.jpeg
    // thumbUri: file:///storage/emulated/0/Download/pexels-photo-323490.jpeg

    Bitmap thumbBitmap;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        thumbBitmap = mContext.getContentResolver().loadThumbnail(thumbUri, thumbSize, null);
    } else {
        thumbBitmap = MediaStore.Images.Thumbnails.getThumbnail(mContext.getContentResolver(),
                imgId, MediaStore.Images.Thumbnails.MINI_KIND, null);
    }

    iconView.setImageBitmap(thumbBitmap);
} catch (Exception e) {
    Log.e("err", e.toString());
}
Run Code Online (Sandbox Code Playgroud)

例外:

java.io.FileNotFoundException: No content provider: file:///storage/emulated/0/Download/pexels-photo-323490.jpeg
Run Code Online (Sandbox Code Playgroud)

android mediastore

6
推荐指数
1
解决办法
4078
查看次数

在Android中将EXIF标签(属性)写入并保存为JPEG图像

我已经设法ExifInterface从手机上的 JPEG 中读取 EXIF 标签/属性(元数据),而且显然我还可以设置属性和保存属性。奇怪的是,如果我在图像文件上设置+保存,我的应用程序能够获取该属性并显示它。我还可以在另一个应用程序(Google Play 上的照片编辑器)中验证确实写入了 EXIF 数据。

ExifInterface exif = new ExifInterface(path_to_image); 
String x = exif.getAttribute("UserComment"); // here, x is always null...

exif.setAttribute("UserComment", "testtest");
exif.saveAttributes();

x = exif.getAttribute("UserComment");  // x = "testtest"
Run Code Online (Sandbox Code Playgroud)

现在,EXIF 已保存到 JPEG 文件中:请参阅我的应用程序的屏幕截图。这也得到了照片编辑器应用程序的验证:见截图

但是,如果我注释掉 set+save 并且只是获取(在与上面相同的图像上),我的应用程序将无法获取/查看该属性:

ExifInterface exif = new ExifInterface(path_to_image); 
String x = exif.getAttribute("UserComment");  // x = null (although we know it isn't)
Run Code Online (Sandbox Code Playgroud)

所以:由于照片编辑器应用程序可以读取数据,我做错了(写入/保存)。此外,如果我在同一个图像文件上重新运行 set+save,我的应用程序会复制相同的标签!除了简单的设置+保存,然后获取之外,还有更多的东西吗?

更新:问题似乎与设备有关。尽管UserComment似乎不在 ExifInterface 明确支持的标签中,但某些设备仍然能够设置和获取标签中的值。它适用于 Nexus'es,但不适用于我的 Sony Xperia。请查看我 …

android exif android-imageview

5
推荐指数
1
解决办法
7376
查看次数

Chartjs饼图,径向位移(偏移量)

Chartjs 2 是否支持饼图段的径向位移(偏移)?

在此处输入图片说明

javascript chart.js2

1
推荐指数
1
解决办法
712
查看次数