Obtenir le chemin d'URI
J'ai Uri pour le fichier Image.
J'utilise ce code pour obtient le chemin d'Uri:
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;
}
Si je choisis l'image à partir de la Galerie de l'application(Android 4.4.2, le bras de l'uem),
uri.getPath = /external/images/media/16 and it work's fine (My file path: /storage/sdcard/Download/0_cf15a_7800a7e5_orig.jpg)
Si je choisis une image à partir de Documents d'application(Android 4.4.2, le bras de l'uem),
I have uri.getPath = /document/image:16 and function getRealPathFromURI returns null.
Comment je peux retourner chemin d'accès correct au fichier pour boths action?
Mon Code Est:-
@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);
}
Gérer l'activité résultat:
@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);
}
Chargement du fichier sélectionné dans ImageView fonctionne bien pour les deux l'etat:
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();
}
}
OriginalL'auteur Artem | 2014-11-17
Vous devez vous connecter pour publier un commentaire.
Solution:
http://hmkcode.com/android-display-selected-image-and-its-real-path/
DocumentsContract.getDocumentId(uri); ses pas résolu, comment organiser l'importation de DocumentsContract
voir le lien après le code
Comment mettre en oeuvre cette non-fichiers d'image?
Jésus. Android Api sont si terribles.
OriginalL'auteur Artem
Une version plus simple de la accepté de répondre à détecter niveau de l'API et d'utiliser la bonne méthode :
OriginalL'auteur yehyatt
Assurez-vous de donner l'autorisation de Manifester.
Gaspillage de 2 heures à essayer différentes méthodes sans donner des autorisations :/
OriginalL'auteur Haroon Rasheed
Je pense que cela devrait fonctionner. Généralisée de code pour obtenir de l'URI de la voie :
OriginalL'auteur Hirak Chhatbar
J'ai donc essayé fondamentalement jamais de réponse sur la pile mais c'est la seule qui a fonctionné pour moi. Il est important de penser à l'uri comme une "promesse" qu'une image de la vie où il indique. Cela ne veut pas dire qu'il y a un fichier à cet emplacement, mais si vous demandez correctement, vous obtiendrez une image. attachementPath est le chemin vers l'image (peut être utilisé comme un fichier normal). Voir ci-dessous:
OriginalL'auteur MarcusM.
public static int getIdFromUri(Uri Uri, String constantId)
{
Cursor c = ContentMaster.getContentResolver().query(uri, new String[]{constantId}, null, null, null);
OriginalL'auteur Ali Bagheri