2016-10-01 74 views
2

時,遇到了java.io.FileNotFoundException我有以下代碼:使用VideoView

VideoView videoView = (VideoView)findViewById(R.id.instructionsvideo); 
    assert videoView != null; 
    videoView.setVideoPath("android.resource://" + getPackageName() + R.raw.testnatureclip); 
    videoView.start(); 

「testnatureclip」 位於原文件夾:

enter image description here

出於某種原因後,我建立該項目文件變成紅色。

這裏是我的錯誤: com.roymunson.vroy.copypastakeyboard W/MediaPlayer: Couldn't open file on client side; trying server side: java.io.FileNotFoundException: No package found for authority: android.resource://com.roymunson.vroy.copypastakeyboard2131165184

的MP4應該以H.264格式編碼的,但我不知道如果在線編碼服務我用工作。

此外,如果重要的話,videoview的尺寸與文件尺寸不一樣。

什麼問題?文件路徑不正確,或者我在初始化videoview時缺少一些元素?

更新一個:

使用User8的解決方案,我得到了以下錯誤:

roymunson.vroy.copypastakeyboard W/MediaPlayer: Couldn't open file on client side; trying server side: java.io.FileNotFoundException: No content provider: /2131165184 
10-01 17:36:20.912 28156-28156/com.roymunson.vroy.copypastakeyboard W/VideoView: Unable to open content: /2131165184 
                       java.io.IOException: setDataSource failed. 
                        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1100) 
                        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1074) 
                        at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1028) 
                        at android.widget.VideoView.openVideo(VideoView.java:346) 
                        at android.widget.VideoView.-wrap0(VideoView.java) 
                        at android.widget.VideoView$7.surfaceCreated(VideoView.java:623) 
                        at android.view.SurfaceView.updateWindow(SurfaceView.java:582) 
                        at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:177) 
                        at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944) 
                        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) 
                        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1119) 
                        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6060) 
                        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
                        at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                        at android.view.Choreographer.doFrame(Choreographer.java:606) 
                        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                        at android.os.Handler.handleCallback(Handler.java:746) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:148) 
                        at android.app.ActivityThread.main(ActivityThread.java:5443) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

回答

1

我發現2個解決方案:

String uriPath = "android.resource://" + getPackageName() + "/raw/testnatureclip"; 
Uri uri = Uri.parse(uriPath); 
videoView.setVideoURI(uri); 

videoView.setVideoURI(Uri.parse("android.resource://ABSOLUTE_PACKAGE_NAME/" + R.raw.testnatureclip)); 
+0

我在發佈時正在編輯我的答案。 +1是的,只需使用Uri方法即可。關於'getPackageResourcePath()',試試'String uriPath = getPackageResourcePath()+「/ raw/testnatureclip」;'縮短代碼。 – user8

1

試試這個,指定一個絕對軟件包名稱路徑,並使用烏里:

videoView.setVideoURI(Uri.parse("android.resource://com.roymunson.vroy.copypastakeyboard/" 
            + R.raw.testnatureclip)); 

而且,爲什麼不直接使用getPackageResourcePath()來訪問資源?

然後,你通常無法訪問他們的方式,你應該使用他們resourceID,這裏是正是話題的討論:Access resource files in Android

+0

我看你鏈接的帖子,但我不知道如何'getPackageResourcePath()'直接使用。 – Roymunson

+0

此外,我試過你的解決方案,它沒有工作,我會在我原來的帖子編輯後張貼stacktrace。 – Roymunson

+0

@Roymunson我已經更新了我的答案。 – user8