【发布时间】:2017-05-10 11:53:21
【问题描述】:
我目前正在尝试将我保存到我的 MySQLite 数据库中的图像的 Uri 加载到 RecyclerView 中。
RecyclerViewAdapter 的代码:
public void onBindViewHolder(MyCatchesAdapter.MyViewHolder holder, int position) {
MyCatch myCatch = myCatchArrayList.get(position);
holder.txtName.setText(myCatch.get_name());
holder.txtLocation.setText(myCatch.get_location());
holder.txtDate.setText(myCatch.get_date());
holder.catchImage.setImageURI(Uri.parse(myCatch.get_catchImage()));
}
除图像外,所有数据都加载到回收站视图中。我从 Logcat 得到以下信息
Unable to open content: content://com.android.externalstorage.documents/document/primary%3ADownload%2Fsunrise.png
java.lang.SecurityException: Permission Denial: opening provider com.android.externalstorage.ExternalStorageProvider from ProcessRecord
{ee1a504 28074:com.example.pavlos.myproject/u0a74} (pid=28074, uid=10074) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS
我的清单权限是:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
我有什么遗漏的吗?
编辑: 我如何获得 Uri:
catchImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), SELECT_PICTURE);
}
});
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PICTURE) {
Uri selectedImageUri = data.getData();
selectedImagePath = getPath(selectedImageUri);
catchImage.setImageURI(selectedImageUri);
imagePath = selectedImageUri;
Log.d("imagePath","URI "+selectedImageUri);
}
}
}
public String getPath(Uri uri) {
// just some safety built in
if( uri == null ) {
// TODO perform some logging or show user feedback
return null;
}
// try to retrieve the image from the media store first
// this will only work for images selected from gallery
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
if( cursor != null ){
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(column_index);
cursor.close();
return path;
}
// this is our fallback here
return uri.getPath();
}
【问题讨论】:
-
@Opiatefuchs:实际上,我怀疑在这种情况下。
-
@pavlos:你最初是如何准确得到
Uri的?ACTION_GET_CONTENT?ACTION_OPEN_DOCUMENT?还有什么? -
来自文档:MANAGE_DOCUMENTS:此权限只能由平台文档管理应用程序请求。此权限不能授予第三方应用.....您不能使用此权限,您的应用必须是系统应用...
-
@CommonsWare 我编辑了问题以展示我如何获得 Uri
标签: java android imageview uri