2011-01-28 13 views
10

देने के लिए MediaPlayer.prepare का कारण बनती हैं मेरा ऐप मेरे ऐप (/ डेटा/डेटा/कॉम ...) के लिए नामित आंतरिक निर्देशिका से ऑडियो संसाधन फ़ाइलों को चलाता है। ऐसा लगता है कि उस स्थान पर फ़ाइलों को ठीक से डाउनलोड किया जा रहा है, setDataSource (स्ट्रिंग पथ) कोई अपवाद नहीं फेंकता है, लेकिन MediaPlayer.prepare() IOException फेंकता है। एक ही कोड एसडी कार्ड पर काम करता है। ये क्यों हो रहा है?एंड्रॉइड स्टोरेज से एंड्रॉइड बजाने वाली संसाधन फाइलें IPException

संपादित करें:

मान लेते हैं इस कोड है दो; यह मेरे कोड से अधिक आसान है और यह एक ही अपवाद फेंकता है:

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) 

उत्तर

23

MediaPlayer की आवश्यकता है कि फ़ाइल खेला जा रहा दुनिया पठनीय अनुमतियां हैं। आप adb शेल में निम्न आदेश के साथ फ़ाइल की अनुमतियों को देख सकते हैं: "------ -rw"

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

आप शायद देखेंगे, जिसका अर्थ है कि केवल स्वामी (अपने अनुप्रयोग, नहीं MediaPlayer) पढ़ने/लिखने की अनुमति है।

नोट: फ़ाइल को निर्दिष्ट किए बिना ls कमांड का उपयोग करने के लिए आपके फोन को रूट किया जाना चाहिए (आंतरिक मेमोरी में)।

अपने फोन निहित है, तो आप दुनिया-पढ़ने के लिए अनुमतियाँ adb शेल में निम्न आदेश के साथ जोड़ सकते हैं:

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

आप प्रोग्राम इन अनुमतियों को संशोधित करने की जरूरत है (! जड़ें फोन की आवश्यकता है), तो आप उपयोग कर सकते हैं अपने ऐप्लिकेशन कोड में निम्न आदेश:

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

या

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

डब्ल्यू जो मूल रूप से एक लिनक्स कमांड है। Chmod पर अधिक के लिए https://help.ubuntu.com/community/FilePermissions देखें।

संपादित करें: here (रूट किए गए फोन के बिना उन लोगों के लिए उपयोगी) एक और आसान दृष्टिकोण मिला। के बाद से आवेदन फाइल का मालिक है, यह एक फ़ाइल वर्णनकर्ता बना सकते हैं और mediaPlayer.setDataSource() के लिए है कि पारित कर सकते हैं:

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

यह दृष्टिकोण अनुमति मुद्दा पूरी तरह से बचा जाता है।

+0

धन्यवाद, मैं वास्तव में क्या हो रहा था पर उलझन में था। जब मैं फ़ाइल बनाउंगा तो इसे इसे विश्व-पठनीय मोड में सेट कर दूंगा। – AnimatedRNG

+0

@ WRU4Android वह दृष्टिकोण बहुत अच्छा काम करता है, जब तक कि आप MediaRecorder के साथ अपनी फ़ाइलें नहीं बना रहे। Http://stackoverflow.com/questions/3038474/can-a-videoview-play-a-video-stored-on-internal-storage/5475436#5475436 देखें। – gtkandroid

+0

नहीं, मैं MediaRecorder का उपयोग नहीं कर रहा हूं, मैं बस उन्हें ऑनलाइन से डाउनलोड कर रहा हूं। लेकिन टिप के लिए धन्यवाद। – AnimatedRNG

3

मुझे पता है कि यह सवाल गंदगी से बड़ा है, लेकिन इससे मुझे मेरी समस्या को दूर करने में मदद मिली। निम्नलिखित ठीक काम करता है:

 FileOutputStream outStream= openFileOutput("movie.mp4", MODE_WORLD_READABLE); 

विश्व पठनीय ध्वज यहां महत्वपूर्ण हिस्सा है।

+0

उस दृष्टिकोण से सावधान रहें, आप अन्य ऐप्स को अपनी फ़ाइल तक पहुंचने दे रहे हैं (बशर्ते कि: 1) यह आंतरिक संग्रहण में है, 2) वे आपके पूर्ण योग्य पैकेज नाम को जानते हैं, 3) वे सटीक फ़ाइल नाम जानते हैं)। –

+0

आप क्या सुझाव देंगे? – MattD

+0

मेरे पास एक ही चीज है, केवल "क्रिप्टिक-छद्म-यादृच्छिक" फ़ाइल नाम का उपयोग कर। मुझे कोई अन्य सभ्य समाधान नहीं मिला है। –