2017-04-13 66 views
0

我试图从Android保存图像文件,但出现错误。我已经为清单添加了读写权限。我想保存图像文件这样的文件路径(是这样的“内容://媒体/外部/图像/媒体/ 12”):从Android保存图像文件

File source = new File(filePath); 
blob.upload(new FileInputStream(source), source.length()); 

的错误,我得到:

04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err: java.io.FileNotFoundException: content:/media/external/images/media/12: open failed: ENOENT (No such file or directory) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:452) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:76) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at com.example.gaya.searchpeople.PhotoInfoActivity$NetworkConnector.doInBackground(PhotoInfoActivity.java:103) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at com.example.gaya.searchpeople.PhotoInfoActivity$NetworkConnector.doInBackground(PhotoInfoActivity.java:75) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at java.lang.Thread.run(Thread.java:818) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at libcore.io.Posix.open(Native Method) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:438) 
04-13 09:27:05.453 6947-7534/com.example.gaya.searchpeople W/System.err: ... 9 more 

回答

1

这不是文件路径。您已将Uri转换为String,并试图将其用作文件路径。这不起作用。

请致电openInputStream()联系ContentResolver,以获得所标识内容的InputStream

0

尝试使用此,它的工作对我来说,从URI

public static String getAbsolutePath(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 the remote address 
if (isGooglePhotosUri(uri)) 
    return uri.getLastPathSegment(); 

return getDataColumn(context, uri, null, null); 
} 
// File 
else if ("file".equalsIgnoreCase(uri.getScheme())) { 
return uri.getPath(); 
} 

return null; 
} 


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 index = cursor.getColumnIndexOrThrow(column); 
    return cursor.getString(index); 
} 
} finally { 
if (cursor != null) 
    cursor.close(); 
} 
return null; 
} 

public static boolean isExternalStorageDocument(Uri uri) { 
return "com.android.externalstorage.documents".equals(uri.getAuthority()); 
} 

public static boolean isDownloadsDocument(Uri uri) { 
return "com.android.providers.downloads.documents".equals(uri.getAuthority()); 
} 


public static boolean isMediaDocument(Uri uri) { 
return "com.android.providers.media.documents".equals(uri.getAuthority()); 
} 

public static boolean isGooglePhotosUri(Uri uri) { 
return "com.google.android.apps.photos.content".equals(uri.getAuthority()); 
} 
得到绝对的文件路径