Obtener la URI de .archivos mp3 almacenados en res/raw carpeta en android

Tengo muchos .los archivos mp3 almacenados en res/raw carpeta.

Estoy recibiendo URI de .mp3 archivo usando el siguiente código.

Uri.parse("android.resource:///com.my.android.sharesound/"+resId);

Devuelve : android.resource:///com.my.android.sharesound/2130968609

Ahora estoy usando este URI en la creación de Compartir Intención

    shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("android.resource://com.my.android.sharesound/"+resId));
    startActivity(Intent.createChooser(shareIntent,"Share Sound");

Al seleccionar cualquier aplicación de Correo por ejemplo. Gmail o YahooMail de la Cuota de la Intención, el archivo de mp3 conectado correctamente. Pero muestra que 2130968609(como datos adjuntos)

no quiero resourceId(2130968609) para que aparezca.

Quiero mostrar nombre de archivo.mp3

¿Cómo puedo hacer eso? Me estoy perdiendo algo ?

O

Es hay alguna otra manera de adjuntar .archivos mp3 almacenados en res/raw a través de correo Compartir Intención.

7 Kommentare

  1. 162

    Finalmente, después de buscar mucho he encontrado la solución.

    Si desea obtener cualquiera de los recursos de URI, a continuación, hay dos formas :

    1. El Uso De Recursos De Nombre De

      Sintaxis : android.resource://[package]/[res type]/[res name]

      Ejemplo : Uri.parse("android.resource://com.my.package/drawable/icon");

    2. El Uso De Id De Recurso

      Sintaxis : android.resource://[package]/[resource_id]

      Ejemplo : Uri.parse("android.resource://com.my.package/" + R.drawable.icon);

    Esto son los ejemplos para obtener la URI de cualquier archivo de imagen almacenado en la carpeta de dibujable.

    Del mismo modo, usted puede obtener los Uri de res/raw carpeta.

    En mi caso he utilizado 1er forma en que ie. El Uso De Nombre De Recurso

    • gracias por la respuesta. De la OMI, creo que la segunda opción sería preferible cambiar el nombre del recurso, etc. pueden ser fácilmente refactorizado. Por lo tanto, decidí que.
    • para ayudar a la refactorización de código, también se puede sustituir el nombre del paquete con Context.getPackageName()
    • Oh, sólo para continuar con la diversión cositas, puede utilizar File.separator en lugar de escribir /. Y, usted puede volver loco con File.pathSeparator en lugar de escribir :. También, gran respuesta!
    • Gracias por la gran respuesta… he elegido de 2 vías.
    • "android.resource" = ContentResolver.SCHEME_ANDROID_RESOURCE
    • Si desea utilizar este URL en un WebView, al menos en Lollipop (yo no intente otras versiones) que usted necesita para establecer una costumbre WebViewClient que administra las direcciones Url, algo como esto: public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (url.startsWith(ContentResolver.SCHEME_ANDROID_RESOURCE + "://")) { int idPos = url.lastIndexOf('/'); int id = Integer.parseInt(url.substring(idPos + 1)); return new WebResourceResponse("text/html", "", resources.openRawResource(id)); } return null; }
    • ¿Cómo se resuelve esto en Lollipop, un par de puntos en la dirección correcta será apreciado.

  2. 35

    Este trabajo como por arte de magia:
    Suponiendo que el mp3 se guarda en la carpeta raw como

    notification_sound.mp3

    entonces simple de hacer esto funciona:

    Uri uri=Uri.parse("android.resource://"+getPackageName()+"/raw/notification_sound");
  3. 6

    Aquí están algunos métodos que pueden ayudar a alguien:

        public Uri getRawUri(String filename) {
            return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/raw/" + filename);
        }
        public Uri getDrawableUri(String filename) {
            return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/drawable/" + filename);
        }
        public Uri getMipmapUri(String filename) {
            return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/mipmap/" + filename);
        }

    Basta con llamar al método como este:

    Uri rawUri = getRawUri("myFile.filetype");
  4. 2

    Una línea de Respuesta

    RingtoneManager.getRingtone(getContext(),Uri.parse("android.resource://com.my.package/" + R.raw.fileName)).play();
  5. 1

    Intente guardar el archivo a la SDCard y tal vez, a continuación, enviar el nuevo URI,

     public boolean saveAs(int resSoundId){
     byte[] buffer = null;
     InputStream fIn = getBaseContext().getResources().openRawResource(resSoundId);
     int size=0;
    
     try {
      size = fIn.available();
      buffer = new byte[size];
      fIn.read(buffer);
      fIn.close();
     } catch (IOException e) {
      //TODO Auto-generated catch block
      return false;
     }
    
     String path = "/sdcard/yourapp/temp/";
     String filename = "filename"+".mp3";
    
     boolean exists = (new File(path)).exists();
     if (!exists){new File(path).mkdirs();}
    
     FileOutputStream save;
     try {
      save = new FileOutputStream(path+filename);
      save.write(buffer);
      save.flush();
      save.close();
     } catch (FileNotFoundException e) {
      //TODO Auto-generated catch block
      return false;
     } catch (IOException e) {
      //TODO Auto-generated catch block
      return false;
     }    

    Recuerde eliminar el archivo después de que el correo electrónico se ha enviado correctamente.

    • Gracias Reno. Pero no creo que vaya a tener una cierta cantidad de tiempo para escribir el archivo a la sdcard, obtener uri y, a continuación, elimínelo. ?.. Eliminar creará un problema para mí. Cuando debo eliminar el archivo ?. No podemos predecir la Intención de Compartir aplicaciones. resultado.
    • Cierto, esto es sólo una solución, en caso de que usted no consigue nada. Eliminar el directorio temporal cuando la aplicación se cierra.
    • href=»http://stackoverflow.com/questions/5888718/android-share-images-from-assets-folder/7177103#7177103″>Pruebe esta solución, trabajó para alguien.
    • ok. yo creo que no hay otra manera de obtener la URI de la res. Tengo otra pregunta, pero relacionado con esto solo. Al seleccionar cualquier aplicación de Correo, archivo que se adjunta. Pero cuando voy a seleccionar el Whatsapp, me pide elegir el contacto pero no mostrar el archivo adjunto.
    • Yo realmente no sé cómo Whatsapp maneja su apego intenciones, y sí, ir a por cualquiera que sea la opción es conveniente
    • Yo tengo trabajo : ver mi respuesta stackoverflow.com/questions/7976141/…

  6. 0

    Aquí es una buena manera de conseguir cualquier recurso,

     Uri.parse(String.format("android.resource://%s/%s/%s",this.getPackageName(),"resource_folder_name","file_name"));
  7. 0

    No construir la cadena en su propia, utilizar Uri.Builder:

    /**
     * @param resourceId identifies an application resource
     * @return the Uri by which the application resource is accessed
     */
    internal fun Context.getResourceUri(@AnyRes resourceId: Int): Uri = Uri.Builder()
        .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
        .authority(packageName)
        .path(resourceId.toString())
        .build()

    De AOSP-DeskClock.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea