Ottieni il path di file da URI

Ho Uri per il file di image.

Utilizzo questo codice per get il path di file da Uri:

  • Android Facebook ottiene tutte le informazioni sul profilo
  • Android App - Come salvare un disegno bitmap sulla canvas come image? Controllare il codice?
  • L'esecuzione non è rioutput per l'attività ': app: processDebugManifest' dopo che Android Stdio 2.2 udpate
  • Android: distriggers le rotazioni di 90 °, ma abilita le rotazioni di 180 °
  • Come spostare un'image sul path tra due posizioni sulla mappa in android
  • Differenti disegni basati sulla variante di costruzione di Gradle
  • public String getRealPathFromURI(Uri contentUri) { Cursor cursor = null; try { String[] proj = { MediaStore.Images.Media.DATA }; cursor = mContext.getContentResolver().query(contentUri, proj, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } catch (Exception e) { Log.message(e.getMessage()); } finally { if (cursor != null) { cursor.close(); } } return null; } 

    Se scegli l'image da un'applicazione Galleria (Android 4.4.2, arm-emu),

     uri.getPath = /external/images/media/16 and it work's fine (My file path: /storage/sdcard/Download/0_cf15a_7800a7e5_orig.jpg) 

    Se scegli l'image dall'applicazione Documenti (Android 4.4.2, arm-emu),

      I have uri.getPath = /document/image:16 and function getRealPathFromURI returns null. 

    Come posso restituire il path corretto al file per entrambe le azioni?

    Il mio codice è: –

      @Override public void onClick(View v) { final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "Photohunt" + File.separator); root.mkdirs(); final String fname = Common.getUniqueImageFilename(); final File sdImageMainDirectory = new File(root, fname); outputFileUri = Uri.fromFile(sdImageMainDirectory); // Camera. final List<Intent> cameraIntents = new ArrayList<Intent>(); final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); final PackageManager packageManager = mContext.getPackageManager(); final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); for(ResolveInfo res : listCam) { final String packageName = res.activityInfo.packageName; final Intent intent = new Intent(captureIntent); intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); intent.setPackage(packageName); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); cameraIntents.add(intent); } // Filesystem. final Intent galleryIntent = new Intent(); galleryIntent.setType("image/*"); galleryIntent.setAction(Intent.ACTION_GET_CONTENT); // Chooser of filesystem options. final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); // Add the camera options. chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{})); startActivityForResult(chooserIntent, PICTURE_REQUEST_CODE); } 

    Risultato dell'attività maniglia:

     @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode == Activity.RESULT_OK) { if(requestCode == PICTURE_REQUEST_CODE) { final boolean isCamera; if(data == null) { isCamera = true; } else { final String action = data.getAction(); if(action == null) { isCamera = false; } else { isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); } } Uri selectedImageUri; if(isCamera) { selectedImageUri = outputFileUri; } else { selectedImageUri = data == null ? null : data.getData(); } Log.variable("uri", selectedImageUri.getPath()); ConfirmImageFragment fragment = new ConfirmImageFragment(selectedImageUri, mContestId); FragmentTransaction transaction = getSherlockActivity().getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.main_container, fragment); transaction.addToBackStack(null); transaction.commit(); } } super.onActivityResult(requestCode, resultCode, data); } 

    Caricare il file selezionato in ImageView funziona bene sia per lo stato che:

     private void loadImage() { try { Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), mUri); mImage.setImageBitmap(bitmap); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

  • MediaStore.Audio.Albums.ALBUM_ID colonna non valida
  • Cambiare il colore di text in ListView
  • Come vendere un'applicazione a pagamento da un paese non supportto
  • Come riconoscere quando l'utente non desidera connettersi a Google Play Services?
  • requestWindowFeature (Window.FEATURE_NO_TITLE); fa l'exception
  • Spinner con freccia a sinistra
  • 5 Solutions collect form web for “Ottieni il path di file da URI”

    Soluzione:

      public class RealPathUtil { @SuppressLint("NewApi") public static String getRealPathFromURI_API19(Context context, Uri uri){ String filePath = ""; String wholeID = DocumentsContract.getDocumentId(uri); // Split at colon, use second item in the arrays String id = wholeID.split(":")[1]; String[] column = { MediaStore.Images.Media.DATA }; // where id is equal to String sel = MediaStore.Images.Media._ID + "=?"; Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel, new String[]{ id }, null); int columnIndex = cursor.getColumnIndex(column[0]); if (cursor.moveToFirst()) { filePath = cursor.getString(columnIndex); } cursor.close(); return filePath; } @SuppressLint("NewApi") public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) { String[] proj = { MediaStore.Images.Media.DATA }; String result = null; CursorLoader cursorLoader = new CursorLoader( context, contentUri, proj, null, null, null); Cursor cursor = cursorLoader.loadInBackground(); if(cursor != null){ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); result = cursor.getString(column_index); } return result; } public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri){ String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } } 

    http://hmkcode.com/android-display-selected-image-and-its-real-path/

    Una versione più semplice della risposta accettata che rileva il livello API e utilizza il metodo corretto:

     @TargetApi(Build.VERSION_CODES.KITKAT) public static String getFilePath(Context context, Uri uri) { int currentApiVersion; try { currentApiVersion = android.os.Build.VERSION.SDK_INT; } catch(NumberFormatException e) { //API 3 will crash if SDK_INT is called currentApiVersion = 3; } if (currentApiVersion >= Build.VERSION_CODES.KITKAT) { String filePath = ""; String wholeID = DocumentsContract.getDocumentId(uri); // Split at colon, use second item in the arrays String id = wholeID.split(":")[1]; String[] column = {MediaStore.Images.Media.DATA}; // where id is equal to String sel = MediaStore.Images.Media._ID + "=?"; Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel, new String[]{id}, null); int columnIndex = cursor.getColumnIndex(column[0]); if (cursor.moveToFirst()) { filePath = cursor.getString(columnIndex); } cursor.close(); return filePath; } else if (currentApiVersion <= Build.VERSION_CODES.HONEYCOMB_MR2 && currentApiVersion >= Build.VERSION_CODES.HONEYCOMB) { String[] proj = {MediaStore.Images.Media.DATA}; String result = null; CursorLoader cursorLoader = new CursorLoader( context, uri, proj, null, null, null); Cursor cursor = cursorLoader.loadInBackground(); if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); result = cursor.getString(column_index); } return result; } else { String[] proj = {MediaStore.Images.Media.DATA}; Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } } 

    Assicurati di dare il permesso in Manifest. Ha perso 2 ore cercando diversi methods senza dare autorizzazioni: /

     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

    Penso che questo dovrebbe funzionare. Un codice generalizzato per get l'URI dal path:

     String path = yourAndroidURI.uri.getPath() File file = new File(new URI(path)); 

    Così ho provato fondamentalmente sempre la risposta sulla pila ma questo è stato l'unico che ha funzionato per me. È importnte pensare agli uri come una "promise" che un'image viva where punta. Questo non significa che esista un file in quella posizione, ma se chiedi correttamente otterrai un'image. attachementPath è il path dell'image (può essere utilizzato come un file normale). Vedi sotto:

     try { InputStream input = getActivity().getContentResolver().openInputStream(imageUri); File file = new File(getActivity().getCacheDir(), "cacheFileAppeal.png"); try { OutputStream output = new FileOutputStream(file); try { try { byte[] buffer = new byte[4 * 1024]; // or other buffer size int read; if (input != null) { while ((read = input.read(buffer)) != -1) { output.write(buffer, 0, read); } } output.flush(); } finally { output.close(); attachmentPath = file.getAbsolutePath(); } } catch (Exception e) { e.printStackTrace(); // handle exception, define IOException and others } } finally { try { if (input != null) { input.close(); } } catch (IOException e) { e.printStackTrace(); } } } catch (FileNotFoundException e) { e.printStackTrace(); } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.