2011-10-30 9 views
6

Tengo una ruta real de un archivo como "file: ///mnt/sdcard/3dphoto/temp19.jps" , ¿cómo puedo obtener el uri como "contenido: // media/external/images/media/1 "?Obtener Uri desde la ruta real

+0

Seems relacionado con http://stackoverflow.com/questions/5657411/android-getting-a-file-uri-from-a-content-uri ¿Podría proporcionar el contexto? – Renaud

Respuesta

6

Transforme su "archivo: // ..." en una ruta de archivo, busque la identificación del artículo con el siguiente código y luego añádalo al URI del proveedor. Además, sobre la base de las extensiones de archivo, utilice el proveedor adecuado (por ejemplo MediaStore.Video.Media.EXTERNAL_CONTENT_URI o 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; 
} 

veces Mediaprovider no se actualiza inmediatamente después de un archivo multimedia agregado al almacenamiento del dispositivo. Puede forzar a actualizar sus registros usando este método:

/** 
* 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

Entonces, ¿qué debería pasar al contexto? – newstartgirls

+0

el contexto de la aplicación, la actividad de llamada, cualquier tipo de Contexto que pueda obtener del código de llamada ... – Rainbowbreeze

+0

¿Alguien sabe cómo es posible lo contrario? En realidad, quiero crear un archivo de "contenido: //" –

6

tuve misma pregunta para mi actividad de exploración de archivos ... pero u debería knw THT la contenturi de archivos sólo admite los datos Mediastore como imagen, audio y vídeo .... te estoy dando para conseguir uri contenido de la imagen desde la selección de una imagen de sdcard .... probar este código ... puede ser que va a trabajar para usted ...

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

¿Y si no es una imagen o video? ¿Qué debemos hacer entonces? – soshial

1

Otra manera fácil:

File file = new File(Path); 

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

Éste no se puede resolver en el caso: carácter especial de la carpeta. No está bien. –

Cuestiones relacionadas