相关疑难解决方法(0)

从URI,Android KitKat新的存储访问框架获取真实路径

Android 4.4(KitKat)中访问新图库之前,我使用此方法在SD卡上获得了真正的路径:

public String getPath(Uri uri) {
   String[] projection = { MediaStore.Images.Media.DATA };
   Cursor cursor = managedQuery(uri, projection, null, null, null);
   startManagingCursor(cursor);
   int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
   cursor.moveToFirst();
 return cursor.getString(column_index);
}
Run Code Online (Sandbox Code Playgroud)

现在,Intent.ACTION_GET_CONTENT返回不同的数据:

之前:

content://media/external/images/media/62
Run Code Online (Sandbox Code Playgroud)

现在:

content://com.android.providers.media.documents/document/image:62
Run Code Online (Sandbox Code Playgroud)

我怎么能设法获得SD卡上的真实路径?

android uri path android-4.4-kitkat

199
推荐指数
8
解决办法
23万
查看次数

Android:通过content:// URI从第三方应用程序(例如WhatsApp)获取图像位图

我正在尝试从第三方应用程序(例如WhatsApp)到我的应用程序(正在棉花糖上测试)的图像。当我从WhatsApp中“共享图像”并与我的应用程序共享时,我得到的URI如下所示:

content://com.whatsapp.provider.media/item/61025
Run Code Online (Sandbox Code Playgroud)

但是在我的应用中,当我调用getContentResolver().openInputStream(uri)getContentResolver().openFileDescriptor(uri, "r")使用上面的URI时,它崩溃并发生以下异常:

java.lang.SecurityException:权限拒绝:从ProcessRecord {a4b804a 30321:com.myapp / u0a145}(pid = 30321,uid = 10145)打开未从uid 10083导出的提供者com.whatsapp.MediaProvider

到目前为止我尝试过的

我在SO上查找此异常,并发现了类似的问题,但要从Google相册导入图像,并需要添加权限,例如:

<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>

但这并不让您感到困惑,因为可能有许多应用程序,并且需要为每个应用程序或其他内容添加权限。

在其他一些答案中,建议立即从内容提供者读取/复制数据。但不确定如何。因为我openInputStream本身就有例外。

我还必须提到,WhatsApp图像可以成功与其他应用程序(例如Google云端硬盘)共享,因此必须有某种方法可以做到这一点。

请有人可以提供共享提示或可行的解决方案吗?

android android-contentresolver android-permissions android-6.0-marshmallow

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

重新启动后,图库中图像的权限会丢失

我的应用程序允许用户从图库或其他位置查看一些选定的图像。我通过以下方式请求图像的 Uri:

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, PickerFragment.PICK_PHOTO);
Run Code Online (Sandbox Code Playgroud)

然后获取 onActivityResult (int requestCode, int resultCode, Intent data) 中的 Uri,并通过以下方式访问这些图像以将它们放入我的应用程序的视图中:

Uri imageUri= data.getData();
Run Code Online (Sandbox Code Playgroud)

当应用程序完成时,我通过以下方式将所有 Uri 作为字符串保存在数据库中:

String imageUriString = imageUri.toString();
saveToDB (imageUriString);
Run Code Online (Sandbox Code Playgroud)

但是,当我重新启动应用程序并通过以下方式从我的数据库恢复所有 Uri 时:

String imageUriString = restoreFromDB ();
imageUri = Uri.parse (imageUriString);
Run Code Online (Sandbox Code Playgroud)

在 Android 7.1 中,应用程序不再具有对这些 Uri 的权限。我通过以下方式访问图像:

ContentResolver cr = mContext.getContentResolver();
InputStream is = cr.openInputStream(imageUri);
BitmapFactory.decodeStream(is, null, o);
Run Code Online (Sandbox Code Playgroud)

但收到此异常:

java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.contentprovider.impl.MediaContentProvider from ProcessRecord
Run Code Online (Sandbox Code Playgroud)

有没有一种优雅且合法的方式来保留该许可?我尝试阅读所有有关权限的文档,但感到非常困惑。

如果您能给我正确的学习方向,我将不胜感激。

PS 在 Uri 的许可持续期间将图像复制到应用程序内存中是一种选择,但我想避免这种情况。至少看看是否可能。

PPS 我拥有授予的所有权限,例如相机和外部存储写入和读取。

permissions android image gallery

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