La lecture des fichiers de ressources Android à partir du stockage interne provoque MediaPlayer.prepare pour donner IOException
Mon app audio, des fichiers de ressources de l'annuaire interne désigné pour mon appli (/data/data/com...). Il semble qu'à télécharger les fichiers à l'emplacement correct, setDataSource(String path) ne jette pas des exceptions, mais MediaPlayer.prepare() throws IOException.Le même code fonctionne sur la carte SD. Pourquoi est-ce arrivé?
EDIT:
Supposons ceci est le code; c'est plus simple que mon code et il jette la même exception:
package com.app.MediaPlayerTest;
public class MediaTest extends Activity {
MediaPlayer mp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DownloadFiles();
MusicPlay();
}
public void DownloadFiles() {
//Downloads Files
}
public void MusicPlay()
{
try {
mp.setDataSource("/data/data/com.app.pronounce/winds.mp3");
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
mp.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mp.setLooping(true);
mp.start();
}
}
Comme pour la trace de la pile:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x4001f1a8 self=0xce48
| sysTid=338 nice=0 sched=0/0 cgrp=bg_non_interactive handle=-1345006528
| schedstat=( 151460588 425586896 45 )
at android.os.BinderProxy.transact(Native Method)
at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:2547)
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:76)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:854)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:851)
at dalvik.system.NativeStart.main(Native Method)
"Binder Thread #2" prio=5 tid=8 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40512b30 self=0x156e90
| sysTid=346 nice=0 sched=0/0 cgrp=default handle=1570912
| schedstat=( 4357682 930487 3 )
at dalvik.system.NativeStart.run(Native Method)
"Binder Thread #1" prio=5 tid=7 NATIVE
| group="main" sCount=1 dsCount=0 obj=0x40512a68 self=0x17f578
| sysTid=345 nice=0 sched=0/0 cgrp=bg_non_interactive handle=604904
| schedstat=( 6939806 13372136 3 )
at dalvik.system.NativeStart.run(Native Method)
"Compiler" daemon prio=5 tid=6 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4050eba8 self=0x938c8
| sysTid=344 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1099136
| schedstat=( 4770066 33579300 5 )
at dalvik.system.NativeStart.run(Native Method)
"JDWP" daemon prio=5 tid=5 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4050eaf8 self=0x10c3c0
| sysTid=343 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1098624
| schedstat=( 14899224 33240040 20 )
at dalvik.system.NativeStart.run(Native Method)
"Signal Catcher" daemon prio=5 tid=4 RUNNABLE
| group="system" sCount=0 dsCount=0 obj=0x4050ea38 self=0x93570
| sysTid=342 nice=0 sched=0/0 cgrp=bg_non_interactive handle=588000
| schedstat=( 24278832 4707632 7 )
at dalvik.system.NativeStart.run(Native Method)
"GC" daemon prio=5 tid=3 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4050e990 self=0x8f720
| sysTid=341 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1099336
| schedstat=( 791698 556969 3 )
at dalvik.system.NativeStart.run(Native Method)
"HeapWorker" daemon prio=5 tid=2 VMWAIT
| group="system" sCount=1 dsCount=0 obj=0x4050e8d8 self=0x10c740
| sysTid=340 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1357728
| schedstat=( 211702049 225986921 9 )
at dalvik.system.NativeStart.run(Native Method)
source d'informationauteur AnimatedRNG
Vous devez vous connecter pour publier un commentaire.
MediaPlayer nécessite que le fichier en cours de lecture est lisible par tout le monde des autorisations. Vous pouvez afficher les permissions de ce fichier avec la commande suivante dans la commande adb shell:
Vous verrez probablement "-rw------", ce qui signifie que seul le propriétaire (votre application, pas MediaPlayer) a des autorisations de lecture/écriture.
Remarque: Votre téléphone doit être rooté pour utiliser la commande ls sans spécifier le fichier (dans la mémoire interne).
Si votre téléphone est enracinée, vous pouvez ajouter du monde-les autorisations de lecture dans la commande adb shell avec la commande suivante:
Si vous avez besoin de modifier ces autorisations par programmation (nécessite un téléphone enracinée!), vous pouvez utiliser la commande suivante dans votre code d'application:
ou
Qui est en fait une commande linux. Voir https://help.ubuntu.com/community/FilePermissions pour en savoir plus sur la commande chmod.
EDIT: Trouvé une autre approche simple ici (utile pour les personnes sans les téléphones rootés). Depuis l'application propriétaire du fichier, il peut créer un descripteur de fichier et le passer à mediaPlayer.setDataSource():
Cette approche permet d'éviter le problème d'autorisation complètement.
Je sais que cette question est âgé de plus de la saleté, mais il m'a aidé à débusquer mon problème. Le suivant fonctionne très bien:
Le monde lisible pavillon est la partie importante ici.