2011-01-28 15 views
10

vermesine neden oluyor Uygulamam, uygulamam için belirlenen iç dizinden (/ data/data/com ...) ses kaynağı dosyalarını çalıştırıyor. Dosyaları o konuma tamam gibi görünüyor, setDataSource (String yolu) herhangi bir istisna atar, ancak MediaPlayer.prepare() IOException atar. Aynı kod SD kartta çalışır. Bu neden oluyor?Dahili depolamadan kaynak dosyalarını yürüten Android, MediaPlayer.prepare uygulamasının IOException

DÜZENLEME:

en bu kodu varsayalım; Benim kod daha basittir ve aynı istisna atar: yığın izleme gelince

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(); 
    } 
} 

:

(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) 

cevap

23

MediaPlayer oynatılan dosya herkesin okuyabileceği izinlere sahip olmasını gerektirir. Sen adb kabuk şu komutla dosyanın izinlerini görüntüleyebilirsiniz: anlamına gelen "------ -RW"

ls -al /data/data/com.mypackage/myfile 

Muhtemelen göreceği tek sahibi (uygulama değil, MediaPlayer) okuma/yazma izinlerine sahiptir. Not: ls komutunu dosyayı belirtmeden (dahili bellekteki) kullanabilmek için telefonunuzun köklenmesi gerekir. Telefonunuz root erişimli ise

, aşağıdaki komutla adb kabuk içinde dünya okuma izinleri ekleyebilirsiniz:

chmod o+r /data/data/com.mypackage/myfile 

programlı Bu izinleri değiştirmeniz gerekiyorsa (! köklü telefon gerektirir), kullanabilirsiniz uygulama kodunuzda aşağıdaki komutu:

Runtime.getRuntime().exec("chmod o+r /data/data/com.mypackage/myfile"); 

veya

Runtime.getRuntime().exec("chmod 777 /data/data/com.mypackage/myfile"); 

W hich temelde linux komutudur. Chmod hakkında daha fazla bilgi için bkz. https://help.ubuntu.com/community/FilePermissions.

DÜZENLEME: Başka bir basit yaklaşım olan here (köklü olmayan telefonlar için kullanışlıdır) bulundu. Uygulama dosyanın sahibi olduğundan, bir dosya tanıtıcı oluşturup mediaPlayer.setDataSource() o iletebilirsiniz:

FileInputStream fileInputStream = new FileInputStream("/data/data/com.mypackage/myfile"); 
mediaPlayer.setDataSource(fileInputStream.getFD()); 

Bu yaklaşım tamamen izin sorununu önler.

+0

Teşekkürler, neler olduğu konusunda kafam karışmıştı. Dosyayı oluşturduğumda dünyaca okunabilir moda ayarlayacağım. – AnimatedRNG

+0

@ WRU4Android MediaRecorder ile dosya oluştururken bu yaklaşım harika çalışır. Http://stackoverflow.com/questions/3038474/can-a-videoview-play-a-video-stored-on-internal-storage/5475436#5475436 adresine bakın. – gtkandroid

+0

Hayır, MediaRecorder kullanmıyorum, sadece çevrimiçi olarak indiriyorum. Ama bahşiş için teşekkürler. – AnimatedRNG

3

Bu sorunun kirden daha eski olduğunu biliyorum, ancak sorunumu temizlememe yardımcı oldu. Aşağıdaki işlemler düzgün:

Dünyada okunabilir bayrak burada önemli bir parçasıdır.

+0

Bu yaklaşıma dikkat edin, diğer uygulamaların dosyanıza erişmesine izin vermiş olursunuz (şu koşulla sağlanmıştır: 1) bu Dahili Depolama İçindir, 2) Tam Kalifiye Paket Adınızı bilirler, 3) Tam dosya adını bilirler). –

+0

Ne önerirsiniz? – MattD

+0

Aynı şey var, sadece "şifreli-sözde rasgele" dosya adı kullanarak. Başka iyi bir çözüm bulamadım. –

İlgili konular