2010-06-14 8 views
18

मैं अपने उपयोगकर्ताओं को बाहरी या आंतरिक भंडारण का उपयोग करने की क्षमता प्रदान करने की कोशिश कर रहा हूं। मैं छवियों और वीडियो (एक वैज्ञानिक प्रकृति के) दोनों प्रदर्शित कर रहा हूँ। एसडी कार्ड पर मीडिया को स्टोर करते समय, सब ठीक है। लेकिन जब मैं आंतरिक रूप से मीडिया स्टोर करता हूं, तो केवल छवियां प्रदर्शित होंगी। इससे कोई फर्क नहीं पड़ता कि मैं कोशिश करता हूं कि applicationcontext.getFilesDir() के तहत संग्रहीत मीडिया को लोड और प्रदर्शित करने का प्रयास करते समय मुझे विभिन्न त्रुटियां मिलती हैं।क्या कोई वीडियोव्यू आंतरिक स्टोरेज पर संग्रहीत वीडियो चला सकता है?

क्या ऐसी फ़ाइल में वीडियोव्यू की सामग्री सेट करने की कोई चाल है?

क्या कोई सामग्री Resolver मेरी मदद कर सकता है?

संबंधित नोट पर, क्या यह माना जाता है कि बाहरी संग्रहण मौजूद है?

अग्रिम धन्यवाद,

सिड

नीचे एक संस्करण है कि के साथ "वीडियो नहीं चला सकता। क्षमा करें, यह वीडियो नहीं चलाया जा सकता है" विफल रहता है। लेकिन मेरे पास विफलता के कई अन्य तरीके हैं। मैं आंतरिक वीडियो को अस्थायी भंडारण (बाहरी) में कॉपी कर सकता हूं और इसे चला सकता हूं, इसलिए आंतरिक रूप से यह प्रतिलिपि वास्तव में एक वैध फिल्म बनाती है। यह केवल तब विफल रहता है जब मैं इसे सीधे आंतरिक संग्रहण से चलाने की कोशिश करता हूं।

videoFile = new File(this.getFilesDir() + File.separator + "test.mp4"); 


InputStream data = res.openRawResource(R.raw.moviegood); 


try { 
    OutputStream myOutputStream = new FileOutputStream(videoFile); 


    byte[] buffer = new byte[8192]; 
    int length; 
    while ((length = data.read(buffer)) > 0) { 
     myOutputStream.write(buffer); 
    } 

    //Close the streams 
    myOutputStream.flush(); 
    myOutputStream.close(); 
    data.close(); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 




vview.setKeepScreenOn(true); 
vview.setVideoPath(videoFile.getAbsolutePath()); 
vview.start(); 
+0

कृपया प्रश्न/कोड प्रारूपित करें, अन्यथा इसे पढ़ना मुश्किल है। आपको किस प्रकार का अपवाद मिल रहा है? यह आपकी मदद करेगा यदि आप अपने पकड़ खंड में स्टैक ट्रेस लॉग करेंगे। वैसे भी, क्या आपको आंतरिक संग्रहण से वीडियो चलाने का कोई तरीका मिला? मैं वही ढूंढ रहा हूं और एक त्रुटि प्राप्त कर रहा हूं जैसे "java.io.IOException: तैयार विफल।" –

+0

मैंने बग की रिपोर्ट करने के लिए http://code.google.com/p/android/issues/detail?id=10197 –

+0

पर एक बग रिपोर्ट दायर की। मैंने बहुत पहले आंतरिक भंडारण छोड़ दिया था। ग्राहक के बजट ने मुझे इस पर काम करने के लिए और अधिक समय बिताने की अनुमति नहीं दी। – shellman

उत्तर

24

मीडियाप्लेयर के लिए आवश्यक है कि फ़ाइल को चलाने के लिए विश्व-पढ़ने योग्य अनुमतियां हों। आप 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"); 

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

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

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

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

+0

धन्यवाद gtkandroid, यह एकदम सही समझ में आता है। (मैं पुराने समय में लिनक्स लड़का हूं, उन दिनों से जब आपने फ्लॉपी डिस्क के एक बॉक्स का उपयोग करके अपना ओएस इंस्टॉल किया था)। हमारे एप्लिकेशन के बाद से बाजार में जारी की गई है, और एक राष्ट्रीय विज्ञान फाउंडेशन द्वारा वित्त पोषित सबसे बड़ा संभव दर्शकों तक पहुंच मतलब परियोजना है, मैं के साथ एसडी कार्ड भंडारण चिपके हुए लगता है कि हमारे लिए ठीक है। चीयर्स, सिड – shellman

+0

मोड WORLD_READABLE यह काम करता है। धन्यवाद gtkandroid – FoamyGuy

+0

@Tim मोड WORLD_READABLE अच्छा काम करता है आप एक FileOutputStream साथ फ़ाइल बना रहे लेकिन MediaRecorder का उपयोग करने वालों के लिए यह एक विकल्प नहीं है, तो। – gtkandroid

1

मैंने एक कस्टम वीडियो व्यू कार्यान्वयन there पोस्ट किया।

वीडियो व्यू कार्यान्वयन में setVideoFD(FileDescriptor fd) विधि है और यह समस्या हल करती है।

+0

VideoView issues..its ठीक से काम नहीं किया है – sheetal

1

मैं इस थ्रेड में एक ही समस्या के साथ आया, मैं अपने वीडियो को वेब से आंतरिक स्टोरेज में डाउनलोड कर रहा हूं, जब आप सहेजते हैं तो आरडब्ल्यू मोड निर्दिष्ट कर सकते हैं, i।PRIVATE से WORLD_READABLE

URL url = new URL(_url); 
InputStream input = null; 
FileOutputStream output = null; 

try { 
String outputName = "video.mp4"; 

input = url.openConnection().getInputStream(); 
output = c.openFileOutput(outputName, Context.MODE_WORLD_READABLE); 

int read; 
byte[] data = new byte[5120]; //5MB byte array 
while ((read = input.read(data)) != -1) 
output.write(data, 0, read); 

return true; 

} finally { 
if (output != null) 
    output.close(); 
if (input != null) 
    input.close(); 
    } 
} 
2

के लिए ई परिवर्तन आप उपयोग कर सकते हैं:

videoView.setVideoURI(Uri.parse(file.getAbsolutePath())); 

अगर फाइल पठनीय दुनिया

है या आप एक सामग्री प्रदाता

1

विस्तार के लिए उपयोग कर सकते हैं check this tutorial

public class AndroidVideoViewExample extends Activity { 

    private VideoView myVideoView; 
    private int position = 0; 
    private ProgressDialog progressDialog; 
    private MediaController mediaControls; 

    @Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // set the main layout of the activity 
     setContentView(R.layout.activity_main); 

     //set the media controller buttons 
     if (mediaControls == null) { 
      mediaControls = new MediaController(AndroidVideoViewExample.this); 
     } 

     //initialize the VideoView 
     myVideoView = (VideoView) findViewById(R.id.video_view); 

     // create a progress bar while the video file is loading 
     progressDialog = new ProgressDialog(AndroidVideoViewExample.this); 
     // set a title for the progress bar 
     progressDialog.setTitle("JavaCodeGeeks Android Video View Example"); 
     // set a message for the progress bar 
     progressDialog.setMessage("Loading..."); 
     //set the progress bar not cancelable on users' touch 
     progressDialog.setCancelable(false); 
     // show the progress bar 
     progressDialog.show(); 

     try { 
      //set the media controller in the VideoView 
      myVideoView.setMediaController(mediaControls); 

      //set the uri of the video to be played 
      myVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.kitkat)); 

     } catch (Exception e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 

     myVideoView.requestFocus(); 
     //we also set an setOnPreparedListener in order to know when the video file is ready for playback 
     myVideoView.setOnPreparedListener(new OnPreparedListener() { 

      public void onPrepared(MediaPlayer mediaPlayer) { 
       // close the progress bar and play the video 
       progressDialog.dismiss(); 
       //if we have a position on savedInstanceState, the video playback should start from here 
       myVideoView.seekTo(position); 
       if (position == 0) { 
        myVideoView.start(); 
       } else { 
        //if we come from a resumed activity, video playback will be paused 
        myVideoView.pause(); 
       } 
      } 
     }); 

    } 

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
     super.onSaveInstanceState(savedInstanceState); 
     //we use onSaveInstanceState in order to store the video playback position for orientation change 
     savedInstanceState.putInt("Position", myVideoView.getCurrentPosition()); 
     myVideoView.pause(); 
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     //we use onRestoreInstanceState in order to play the video playback from the stored position 
     position = savedInstanceState.getInt("Position"); 
     myVideoView.seekTo(position); 
    } 
} 
0

आप इसे सीधे नहीं खेल सकते हैं।

आपको एक सामग्री प्रदाता को लागू करने की आवश्यकता है, फिर परिभाषित उरी को VideoUri (uri) विधि सेट करने के लिए पास करें।

संबंधित मुद्दे