2013-05-01 147 views
24

我正在開發一些應用程序,它允許從SD卡中選擇圖像,將其保存到數據庫中併爲ImageView設置此值。我需要知道將uri轉換爲字符串和字符串到uri的方式。現在我用getEncodedPath()烏里的方法,但是,例如,這個代碼不工作:將Uri轉換爲字符串和字符串到Uri

ImageView iv=(ImageView)findViewById(R.id.imageView1); 
Uri uri=Uri.parse("/external/images/media/470939"); 
Log.e("uri1", uri.toString()); 
iv.setImageURI(uri); 

所以我不知道我怎麼能保存到烏里數據庫,並從保存的值創建一個新的URI 。請幫我解決它。

+0

你說的 '它不工作' 是什麼意思?你會得到什麼錯誤? – 2013-05-01 18:57:42

+0

我沒有ImageView的圖像 – user2218845 2013-05-01 18:58:42

回答

42

我需要知道如何將uri轉換爲字符串和字符串到uri。

使用toString()Uri轉換爲String。使用Uri.parse()String轉換爲Uri

此代碼不起作用

這不是一個Uri的有效字符串表示。 A Uri有一個計劃,並且"/external/images/media/470939"沒有計劃。

+0

而是嘗試使用Uri.fromFile().. 有時候Uri.parse會產生問題.. – AnkitRox 2016-06-30 10:59:31

-2

您可以使用Drawable而不是Uri。

ImageView iv=(ImageView)findViewById(R.id.imageView1); 
    String pathName = "/external/images/media/470939"; 
    Drawable image = Drawable.createFromPath(pathName); 
    iv.setImageDrawable(image); 

這會奏效。

+0

不,它不起作用 – 2016-10-04 09:56:53

0

這將從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()); 
} 
1

嘗試使用此方法將字符串轉換爲URI

String mystring="Hello" 
Uri myUri = Uri.parse(mystring); 

的URI字符串

Uri uri; 
String uri_to_string; 
uri_to_string= uri.toString();