2017-04-13 8 views
0

Ich versuche, die Bilddatei von Android zu speichern, aber eine Fehlermeldung erhalten. Ich habe bereits Lese- und Schreibberechtigungen für das Manifest hinzugefügt. Ich versuche, die Image-Datei auf diese Weise (der Dateipfad wie dieser ist "Inhalt: // media/extern/images/media/12"): speichernBilddatei von Android speichern

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

Der Fehler erhalte ich:

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 

Antwort

1

Das ist kein Dateipfad. Sie haben eine Uri genommen, sie in eine String umgewandelt und versuchen, sie als Dateipfad zu verwenden. Dies wird nicht funktionieren.

Stattdessen rufen openInputStream() auf einem ContentResolver einen InputStream auf den Inhalt von Ihrem Uri identifiziert zu bekommen.

0

versuchen, dies zu verwenden, es funktionierte für mich von URI absoluten Dateipfad zu erhalten

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()); 
} 
Verwandte Themen