MediaPlayer setDataSource, mieux utiliser le chemin d'accès ou FileDescriptor?

Disons que j'ai un chemin complet vers un fichier. Quelle est la meilleure approche pour charger ce fichier dans un MediaPlayer?

String filePath = "somepath/somefile.mp3"; mediaPlayer.setDataSource(filePath); 

OU

  • Impossible d'obtenir une mise en page correcte avec "fill_parent"
  • VideoView dans un fond d'écran en direct?
  • Obtenir l'identifiant de ressource à partir d'ImageView
  • Comment obtenir une liste de fichiers à partir d'un dossier spécifique dans le stockage interne?
  • Existe-t-il un chargeur de neuf patchs pour iPhone?
  • Pour exécuter dex en cours, le daemon Gradle a besoin d'un tas plus large. Il a actuellement 910 Mo
  •  String filePath = "somepath/somefile.mp3"; File file = new File(filePath); FileInputStream inputStream = new FileInputStream(file); mediaPlayer.setDataSource(inputStream.getFD()); inputStream.close(); 

    Est-ce que ça importe? L'utilisation simple du chemin semble plus simple, mais y at-il une raison de faire le travail supplémentaire pour utiliser un FileDescriptor?

    2 Solutions collect form web for “MediaPlayer setDataSource, mieux utiliser le chemin d'accès ou FileDescriptor?”

    En fait, il s'avère qu'il y a une différence dans certaines situations.

    mediaPlayer.setDataSource(String path) échoue lorsque vous appelez mediaPlayer.prepare() , si vous essayez de charger un fichier à partir de getApplicationContext().getFilesDir() , selon la façon dont le fichier a été enregistré. Par exemple, si j'écris un fichier en utilisant le new RandomAccessFile(filePath, "rw") , le mediaplayer n'est pas réellement lisible si vous utilisez mediaPlayer.setDataSource(String path) . La prepare() déclenchera immédiatement une error(1, -2147483648) du mediaplayer; Essentiellement une erreur d'autorisation de fichier. SDK 9 a introduit le file.setReadable (boolean readable, boolean ownerOnly) qui vous permettra probablement de résoudre ce problème en définissant ownerOnly false … mais cela ne vous aide pas si vous devez prendre en charge les SDK plus anciens.

    mediaPlayer.setDataSource(FileDescriptor fd) , mediaPlayer.setDataSource(FileDescriptor fd) n'a PAS ce problème et le mediaplayer préparera avec succès le même fichier exact sans problème d'autorisation.

    MediaPlayer.java a configuré les signatures DataAsource () qui acceptent à la fois un String (chemin) et un FD. Ils entrent tous deux dans le code C natif. Bien que l'un d'entre eux soit légèrement plus efficace, il sera négligeable, sauf si vous définissez votre source de données plus souvent qu'une fois par seconde.

     /** * Sets the data source (file-path or http/rtsp URL) to use. Call this after * reset(), or before any other method (including setDataSource()) that might * throw IllegalStateException in this class. * * @param path the path of the file, or the http/rtsp URL of the stream you want to play * @throws IllegalStateException if it is called * in an order other than the one specified above */ public native void setDataSource(String path) throws IOException, IllegalArgumentException, IllegalStateException; /** * Sets the data source (FileDescriptor) to use. It is the caller's responsibility * to close the file descriptor. It is safe to do so as soon as this call returns. * Call this after reset(), or before any other method (including setDataSource()) * that might throw IllegalStateException in this class. * * @param fd the FileDescriptor for the file you want to play * @throws IllegalStateException if it is called * in an order other than the one specified above */ public void setDataSource(FileDescriptor fd) throws IOException, IllegalArgumentException, IllegalStateException { // intentionally less than LONG_MAX setDataSource(fd, 0, 0x7ffffffffffffffL); } /** * Sets the data source (FileDescriptor) to use. It is the caller's responsibility * to close the file descriptor. It is safe to do so as soon as this call returns. * Call this after reset(), or before any other method (including setDataSource()) * that might throw IllegalStateException in this class. * * @param fd the FileDescriptor for the file you want to play * @param offset the offset into the file where the data to be played starts, in bytes * @param length the length in bytes of the data to be played * @throws IllegalStateException if it is called * in an order other than the one specified above */ public native void setDataSource(FileDescriptor fd, long offset, long length) throws IOException, IllegalArgumentException, IllegalStateException; 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.