2017-09-04 2 views
0

Ich erstelle einen Media Player mit ReactNative. Um eine solche App zu erstellen, musste ich ein Modul exportieren, das ich für das Abrufen von Musik-Metadaten wie Album, Künstler usw. sowie den Dateipfad erstellt hatte.MediaMetadataRetriever.setDataSource (systemeigene Methode) verursacht RuntimeException: status = 0xFFFFFFEA

Der obige Code funktioniert perfekt jdk1.8.0_112 verwenden, aber da ich zu jdk1.8.0_144 aktualisiert Arbeits Es gestoppt.

In diesem Beispiel suche ich nicht nach nicht null, nicht leer, Länge> 0, etc, aber ich wirklich in der Originalversion.

try { 
    MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
    mmr.setDataSource("Path to the file"); // /storage/337C-1C15/Music/Edguy/Speedhoven.mp3 
} catch (RuntimeException ex) { 
    // java.lang.RuntimeException: setDataSource failed: status = 0xFFFFFFEA 
} 

Ich habe zwei Probleme. Auf der einen Seite bin ich kein großartiger Android-Entwickler, also ist es schwierig, einige Hinweise zu bekommen. Auf der anderen Seite liefert der Fehler eine gute Beschreibung.

Gerade falls einige von euch hatten eine bessere Art und Weise zu erreichen, was ich versuchte, ich den ganzen Code hier links:

@ReactMethod 
public void getAll(Callback errorCallback, Callback successCallback){ 

    ContentResolver musicResolver = this.getCurrentActivity().getContentResolver(); 
    Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null); 

    if (musicCursor != null && musicCursor.moveToFirst()) { 

     WritableArray jsonArray = new WritableNativeArray(); 
     MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
     WritableMap items = new WritableNativeMap(); 

     int titleColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE); 
     int idColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID); 
     int artistColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.ARTIST); 

     try { 
      do { 
       items = new WritableNativeMap(); 
       byte[] art; 

       long thisId = musicCursor.getLong(idColumn); 
       String thisPath = musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); 
       String thisTitle = musicCursor.getString(titleColumn); 
       String thisArtist = musicCursor.getString(artistColumn); 
       String duration = musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); 


       if(thisPath != null && thisPath != "" && thisPath.endsWith(".mp3")) { 

        mmr.setDataSource(thisPath); 

        String album = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); 
        String artist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST); 
        String title = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); 
        String genre = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE); 
        String encoded = ""; 
        String encodedImage = ""; 
        art = mmr.getEmbeddedPicture(); 

        if (album == null) { 
         album = thisArtist; 
        } 

        if (artist == null) { 
         artist = thisArtist; 
        } 

        if (title == null) { 
         title = thisTitle; 
        } 

        if (art != null) { 
         Bitmap songImage = BitmapFactory.decodeByteArray(art, 0, art.length); 
         if(songImage != null){ 
          ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
          songImage.compress(Bitmap.CompressFormat.JPEG, 60, byteArrayOutputStream); 
          byte[] byteArray = byteArrayOutputStream.toByteArray(); 
          encodedImage = Base64.encodeToString(byteArray, Base64.DEFAULT); 
          String pathtoImg = ""; 
          byte[] imageByte = Base64.decode(encodedImage, Base64.DEFAULT); 
          try { 
           pathtoImg = Environment.getExternalStorageDirectory() + "/" + thisId + ".jpg"; 
           File filePath = new File(pathtoImg); 
           FileOutputStream fos = new FileOutputStream(filePath, true); 
           encoded = pathtoImg; 
           fos.write(imageByte); 
           fos.flush(); 
           fos.close(); 
          } catch (FileNotFoundException fnfe) { 
           errorCallback.invoke(fnfe.getMessage()); 
          } catch (IOException ioe) { 
           errorCallback.invoke(ioe.getMessage()); 
          } 
         } 
        } 

        String str = String.valueOf(thisId); 
        items.putString("id", str); 
        items.putString("album", album); 
        items.putString("artist", artist); 
        items.putString("title", title); 
        items.putString("genre", genre); 

        if (encoded == "") { 
         items.putString("cover", ""); 
        } else { 
         items.putString("cover", "file://" + encoded); 
        } 

        items.putString("duration", duration); 
        items.putString("path", thisPath); 
        jsonArray.pushMap(items); 
       } 
      } while (musicCursor.moveToNext()); 

      successCallback.invoke(jsonArray); 
      mmr.release(); 
     } catch (RuntimeException e) { 
      errorCallback.invoke(e.toString()); 
      mmr.release(); 
     } catch (Exception e) { 
      errorCallback.invoke(e.getMessage()); 
      mmr.release(); 
     } 
    } 
} 

Natürlich habe ich genommen bereits einen Blick auf:

+0

Bitte fügen logcat – bukkojot

+0

Ja, sicher. Wie kann ich es bekommen? –

Antwort

1

Nach dem Debuggen und Recherchieren habe ich das Problem gefunden.

Es scheint, dass mmr.setDataSource("path") eine RuntimeException zurückgibt, wenn etwas mit der Datei nicht stimmt. Dies ist besonders wichtig, da selbst dann, wenn die Datei existiert, ihre Metadaten nicht abgerufen werden können.

Die Lösung war die MediaMetadataRetriever in eine try/catch wie folgt zu verwenden:

while(cursor.moveNext()){ 
    try { 
    MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 
    mmr.setDataSource("Path to the file"); // /storage/337C 1C15/Music/Edguy/Speedhoven.mp3 
    } catch (RuntimeException ex) { 
    // something went wrong with the file, ignore it and continue 
    } 
} 
Verwandte Themen