2011-10-30 4 views
6

J'ai un vrai chemin d'accès à un fichier comme "file: ///mnt/sdcard/3dphoto/temp19.jps" , comment puis-je obtenir l'uri comme "content: // media/external/images/media/1 "?Obtenir Uri à partir du chemin réel

+0

Semble en rapport avec http://stackoverflow.com/questions/5657411/android-getting-a-file-uri-from-a-content-uri Pourriez-vous fournir le contexte? – Renaud

Répondre

6

Transformez votre "fichier: // ..." dans un chemin de fichier, recherchez l'ID de l'élément avec le code suivant, puis ajoutez-le à l'URI du fournisseur. De plus, en fonction des extensions de fichiers, utilisez le bon fournisseur (par exemple MediaStore.Video.Media.EXTERNAL_CONTENT_URI ou MediaStore.Image.Media.EXTERNAL_CONTENT_URI)

/** 
* Given a media filename, returns it's id in the media content provider 
* 
* @param providerUri 
* @param appContext 
* @param fileName 
* @return 
*/ 
public long getMediaItemIdFromProvider(Uri providerUri, Context appContext, String fileName) { 
    //find id of the media provider item based on filename 
    String[] projection = { MediaColumns._ID, MediaColumns.DATA }; 
    Cursor cursor = appContext.getContentResolver().query(
      providerUri, projection, 
      MediaColumns.DATA + "=?", new String[] { fileName }, 
      null); 
    if (null == cursor) { 
     Log.d(TAG_LOG, "Null cursor for file " + fileName); 
     return ITEMID_NOT_FOUND; 
    } 
    long id = ITEMID_NOT_FOUND; 
    if (cursor.getCount() > 0) { 
     cursor.moveToFirst(); 
     id = cursor.getLong(cursor.getColumnIndexOrThrow(BaseColumns._ID)); 
    } 
    cursor.close(); 
    return id; 
} 

Parfois, Mediaprovider ne met pas à jour immédiatement après un fichier multimédia est ajouté au stockage de l'appareil. Vous pouvez forcer à rafraîchir ses enregistrements à l'aide de cette méthode:

/** 
* Force a refresh of media content provider for specific item 
* 
* @param fileName 
*/ 
private void refreshMediaProvider(Context appContext, String fileName) { 
    MediaScannerConnection scanner = null; 
    try { 
     scanner = new MediaScannerConnection(appContext, null); 
     scanner.connect(); 
     try { 
      Thread.sleep(200); 
     } catch (Exception e) { 
     } 
     if (scanner.isConnected()) { 
      Log.d(TAG_LOG, "Requesting scan for file " + fileName); 
      scanner.scanFile(fileName, null); 
     } 
    } catch (Exception e) { 
     Log.e(TAG_LOG, "Cannot to scan file", e); 
    } finally { 
     if (scanner != null) { 
      scanner.disconnect(); 
     } 
    } 
} 
+0

Alors, que dois-je passer au contexte? – newstartgirls

+0

le contexte de l'application, l'activité d'appel, tout type de Contexte que vous pouvez obtenir à partir du code appelant ... – Rainbowbreeze

+0

Quelqu'un sait comment l'inverse est possible? En fait, je veux créer un fichier sur "content: //" –

6

j'avais même question pour mon activité de l'explorateur de fichiers ... mais u devrait knw tht le contenturi pour le fichier prend en charge que les données de Mediastore comme image, audio et vidéo .... Je vous donne pour obtenir uri de contenu d'image de sélectionner une image à partir sdcard .... essayez ce code ... peut-être cela fonctionnera pour vous ...

public static Uri getImageContentUri(Context context, File imageFile) { 
     String filePath = imageFile.getAbsolutePath(); 
     Cursor cursor = context.getContentResolver().query(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
       new String[] { MediaStore.Images.Media._ID }, 
       MediaStore.Images.Media.DATA + "=? ", 
       new String[] { filePath }, null); 
     if (cursor != null && cursor.moveToFirst()) { 
      int id = cursor.getInt(cursor 
        .getColumnIndex(MediaStore.MediaColumns._ID)); 
      Uri baseUri = Uri.parse("content://media/external/images/media"); 
      return Uri.withAppendedPath(baseUri, "" + id); 
     } else { 
      if (imageFile.exists()) { 
       ContentValues values = new ContentValues(); 
       values.put(MediaStore.Images.Media.DATA, filePath); 
       return context.getContentResolver().insert(
         MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
      } else { 
       return null; 
      } 
     } 
    } 
+0

Et si ce n'est pas une image ou une vidéo? Que devrions-nous faire alors? – soshial

1

une autre façon facile:

File file = new File(Path); 

Uri uri = Uri.fromFile(file); 
+1

Celui-ci ne peut pas résoudre dans le cas: caractère spécial du dossier. Pas bon. –

Questions connexes