2011-05-06 62 views
6

En mi programa, quiero guardar un tono de llamada seleccionado por su ruta de archivo, y luego configurarlo como el tono de llamada actual más tarde.¿Cómo obtener el Uri de MediaStore a través de la ruta del archivo?

Tengo el tono de llamada uri de RingtonePreference, y obtengo la ruta del archivo desde la base de datos de MediaStore.

p. Ej.

 
Uri - content://media/internal/audio/media/29 
Path - /system/media/audio/notifications/Ascend.mp3 

Ahora, ¿cómo obtengo el tono de llamada de Uri de la ruta del archivo que guardé?

Dado que el tono de llamada ya existe en MediaStore, probé las siguientes funciones, pero no está funcionando.

 
uriRingtone = MediaStore.Audio.Media.getContentUriForPath(szRingtonePath); 

El Uri no es el mismo que el que obtuve de RingtonePreference.

 
uriRingtone - content://media/internal/audio/media 

¿Cómo consulto MediaStore para obtener el Uri que necesito?

p.s. La razón por la que no almaceno el tono de llamada directamente a Uri es que encontré que el Uri para el mismo tono de llamada podría cambiar a veces en algún dispositivo.

+0

Any one ?? Gracias. – dong221

Respuesta

5

La forma en que puede recuperar el URI de tono de llamada almacenado en la RingtonePreference es (hasta donde yo sé) al conocer el título de la canción. A continuación, puede consultarlo mediante un cursor para obtener _ID tono de llamada almacenados y con ella se puede construir una URI:

String ringtoneTitle = "<The desired ringtone title>"; 
Uri parcialUri = Uri.parse("content://media/external/audio/media"); // also can be "content://media/internal/audio/media", depends on your needs 
Uri finalSuccessfulUri; 

RingtoneManager rm = new RingtoneManager(getApplicationContext()); 
Cursor cursor = rm.getCursor(); 
cursor.moveToFirst(); 

while(!cursor.isAfterLast()) { 
    if(ringtoneTitle.compareToIgnoreCase(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.TITLE))) == 0) { 
    int ringtoneID = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); 
     finalSuccessfulUri = Uri.withAppendedPath(parcialUri, "" + ringtoneID); 
     break; 
    } 
    cursor.moveToNext(); 
} 

donde finalSuccessful uri uri es la que apunta al tono de timbre en el RingtonePreference.

+0

En realidad, probablemente sea mejor utilizar 'MediaStore.Audio.Media.EXTERNAL_CONTENT_URI' o' MediaStore.Audio.Media.INTERNAL_CONTENT_URI' para acceder al URI raíz. –

3

También puede hacerlo de una manera más genérica para cualquier contenido en MediaStore. Tengo que obtener el camino de los URI y obtener el URI de las rutas. El primero:

/** 
* Gets the corresponding path to a file from the given content:// URI 
* @param selectedVideoUri The content:// URI to find the file path from 
* @param contentResolver The content resolver to use to perform the query. 
* @return the file path as a string 
*/ 
private String getFilePathFromContentUri(Uri selectedVideoUri, 
     ContentResolver contentResolver) { 
    String filePath; 
    String[] filePathColumn = {MediaColumns.DATA}; 

    Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null); 
    cursor.moveToFirst(); 

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
    filePath = cursor.getString(columnIndex); 
    cursor.close(); 
    return filePath; 
} 

Este último (que hago videos, sino que también se puede utilizar para audio o archivos u otros tipos de contenido almacenado mediante la sustitución de MediaStore.Audio (etc) para MediaStore.Video:

/** 
* Gets the MediaStore video ID of a given file on external storage 
* @param filePath The path (on external storage) of the file to resolve the ID of 
* @param contentResolver The content resolver to use to perform the query. 
* @return the video ID as a long 
*/ 
private long getVideoIdFromFilePath(String filePath, 
     ContentResolver contentResolver) { 


    long videoId; 
    Log.d(TAG,"Loading file " + filePath); 

      // This returns us content://media/external/videos/media (or something like that) 
      // I pass in "external" because that's the MediaStore's name for the external 
      // storage on my device (the other possibility is "internal") 
    Uri videosUri = MediaStore.Video.Media.getContentUri("external"); 

    Log.d(TAG,"videosUri = " + videosUri.toString()); 

    String[] projection = {MediaStore.Video.VideoColumns._ID}; 

    // TODO This will break if we have no matching item in the MediaStore. 
    Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null); 
    cursor.moveToFirst(); 

    int columnIndex = cursor.getColumnIndex(projection[0]); 
    videoId = cursor.getLong(columnIndex); 

    Log.d(TAG,"Video ID is " + videoId); 
    cursor.close(); 
    return videoId; 
} 

Básicamente, la columna de la DATA de MediaStore (o cualquier sub-sección de la misma está consultando) almacena la ruta del archivo, por lo que utilizar esa información para buscarla

1

@ dong221:. uso URI interna como a MediaStore.Audio.Media.INTERNAL_CONTENT_URI .

2

El siguiente código devolverá una ruta absoluta para el contenido Uri de audio, video e imagen.

public static String getRealPathFromURI(Context context, Uri contentUri) { 
     Cursor cursor = context.getContentResolver().query(contentUri, null, null, null, null); 

     int idx; 
     if(contentUri.getPath().startsWith("/external/image") || contentUri.getPath().startsWith("/internal/image")) { 
      idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
     } 
     else if(contentUri.getPath().startsWith("/external/video") || contentUri.getPath().startsWith("/internal/video")) { 
      idx = cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATA); 
     } 
     else if(contentUri.getPath().startsWith("/external/audio") || contentUri.getPath().startsWith("/internal/audio")) { 
      idx = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DATA); 
     } 
     else{ 
      return contentUri.getPath(); 
     } 
     if(cursor != null && cursor.moveToFirst()) { 
      return cursor.getString(idx); 
     } 
     return null; 
    } 
Cuestiones relacionadas