Java 将 Uri 转换为字符串和将字符串转换为 Uri
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16324482/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Convert Uri to String and String to Uri
提问by user2218845
I'm developing some Application which allows select image from SD Card, save it into database and set this value for ImageView. I need to know way for converting uri to string and string to uri. Now I used getEncodedPath() method of Uri, but, for example, this code doesn't work:
我正在开发一些应用程序,它允许从 SD 卡中选择图像,将其保存到数据库中并为 ImageView 设置此值。我需要知道将 uri 转换为字符串和将字符串转换为 uri 的方法。现在我使用了 Uri 的 getEncodedPath() 方法,但是,例如,这段代码不起作用:
ImageView iv=(ImageView)findViewById(R.id.imageView1);
Uri uri=Uri.parse("/external/images/media/470939");
Log.e("uri1", uri.toString());
iv.setImageURI(uri);
Therefore I don't know how I can save Uri into database and create a new Uri from saved value. Please, help me to fix it.
因此我不知道如何将 Uri 保存到数据库中并从保存的值创建一个新的 Uri。请帮我修复它。
采纳答案by CommonsWare
I need to know way for converting uri to string and string to uri.
我需要知道将 uri 转换为字符串和将字符串转换为 uri 的方法。
Use toString()
to convert a Uri
to a String
. Use Uri.parse()
to convert a String
to a Uri
.
使用toString()
一个转换Uri
的String
。使用Uri.parse()
一个转换String
的Uri
。
this code doesn't work
此代码不起作用
That is not a valid string representation of a Uri
. A Uri
has a scheme, and "/external/images/media/470939"
does not have a scheme.
这不是 a 的有效字符串表示形式Uri
。AUri
有方案,"/external/images/media/470939"
也没有方案。
回答by Yatin Wadhawan
You can use Drawable instead of Uri.
您可以使用 Drawable 代替 Uri。
ImageView iv=(ImageView)findViewById(R.id.imageView1);
String pathName = "/external/images/media/470939";
Drawable image = Drawable.createFromPath(pathName);
iv.setImageDrawable(image);
This would work.
这会奏效。
回答by Naveen Kumar M
This will get the file path from the MediaProvider, DownloadsProvider, and ExternalStorageProvider, while falling back to the unofficial ContentProvider method you mention.
这将从 MediaProvider、DownloadsProvider 和 ExternalStorageProvider 获取文件路径,同时回退到您提到的非官方 ContentProvider 方法。
/**
* Get a file path from a Uri. This will get the the path for Storage Access
* Framework Documents, as well as the _data field for the MediaStore and
* other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @author paulburke
*/
public static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] {
split[1]
};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @param selection (Optional) Filter used in the query.
* @param selectionArgs (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
回答by Hyman
Try this to convert string to uri
试试这个将字符串转换为 uri
String mystring="Hello"
Uri myUri = Uri.parse(mystring);
Uri to String
Uri 到字符串
Uri uri;
String uri_to_string;
uri_to_string= uri.toString();
回答by MyPoint
I am not sure if you got this resolved. To follow up on "CommonsWare's" comment.
我不确定你是否解决了这个问题。跟进“CommonsWare”的评论。
That is not a valid string representation of a Uri. A Uri has a scheme, and "/external/images/media/470939" does not have a scheme.
这不是 Uri 的有效字符串表示形式。一个 Uri 有一个方案,而“/external/images/media/470939”没有一个方案。
Change
改变
Uri uri=Uri.parse("/external/images/media/470939");
to
到
Uri uri=Uri.parse("content://external/images/media/470939");
in my case
就我而言
Uri uri = Uri.parse("content://media/external/images/media/6562");