2011-09-05 24 views
5

Quiero elegir un archivo (a través del selector de archivos) del administrador astro (en mi caso, un * .pdf o * .doc) pero el uri contiene solo la ruta del archivo ("sdcard/my_folder/test.pdf"). Para mi aplicación, necesito la ruta de contenido de ese modo del selector de imágenes (contenido: // media/external/images/media/2 ). ¿Hay alguna forma de convertir un "file:///" en "content://" uri?Convertir archivo uri a contenido uri

¿O alguien tiene otra idea de cómo resolver ese problema?

mejores deseos

ACTUALIZACIÓN: el problema principal es que después de que elegir mi archivo de método FileChooser valuecallback.onReceiveValue (URI) con agrega un "/" detrás de la ruta. Entonces recibo un uri como este: "sdcard/my_folder/test.pdf /" y mi aplicación piensa que el pdf es una carpeta. Cuando uso el contenido uri del selector de imágenes, funciona.

+0

sdcard/my_folder/prueba .pdf esta es la URL correcta para leer los datos de la tarjeta SD en el dispositivo móvil –

Respuesta

11

Como dijo @CommmonsWare, no hay una manera fácil de convertir cualquier tipo de archivos en contenido: //.
Pero aquí es cómo convertir un archivo de imagen en contenido: //

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

Intenté esto para - file: ///storage/emulated/0/Android/data/com.pkg_name/files/out.mp4, pero devuelve * null *. También traté de cambiar 'MediaStore.Images.Media' a' MediaStore.Video.Media', pero todavía no tuve suerte – NarendraJi

+0

Gracias, esta es la única solución que funcionó para mí en mi dispositivo Android-N. Mi aplicación apunta a API 24. – zeeshan

+0

@Ben Lee cuando intento decodificar esta imagen en mapa de bits devuelve nulo. –

5

Aquí está una manera más sencilla de tener en cuenta, que puede ser adecuado para usted.

lo uso para compartir imágenes descargadas en Google Plus de mi aplicación Android:

/** 
* Converts a file to a content uri, by inserting it into the media store. 
* Requires this permission: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
*/ 
protected static Uri convertFileToContentUri(Context context, File file) throws Exception { 

    //Uri localImageUri = Uri.fromFile(localImageFile); // Not suitable as it's not a content Uri 

    ContentResolver cr = context.getContentResolver(); 
    String imagePath = file.getAbsolutePath(); 
    String imageName = null; 
    String imageDescription = null; 
    String uriString = MediaStore.Images.Media.insertImage(cr, imagePath, imageName, imageDescription); 
    return Uri.parse(uriString); 
} 
0

Una forma sencilla de lograr esto podría ser mediante el uso de MediaScannerConnection

File file = new File("pathname"); 
MediaScannerConnection.scanFile(getContext(), new String[]{file.getAbsolutePath()}, null /*mimeTypes*/, new MediaScannerConnection.OnScanCompletedListener() { 
      @Override 
      public void onScanCompleted(String s, Uri uri) { 
       // uri is in format content://... 
      } 
     }); 
Cuestiones relacionadas