java.io.FileNotFoundException:没有内容提供者:

时间:2017-10-29 20:55:45

标签: java android android-videoview

我无法使用videoView.setVideoPath();

复制视频

事实上视频并没有重现......我不知道为什么。视频的路径是正确的。

这是我的代码:

 public class MainActivity extends AppCompatActivity {

        private VideoView videoView;
        private int position = 0;
        private MediaController mediaController;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);


            videoView = (VideoView) findViewById(R.id.videoView);

            // Set the media controller buttons
            if (mediaController == null) {
                mediaController = new MediaController(MainActivity.this);

                // Set the videoView that acts as the anchor for the MediaController.
                mediaController.setAnchorView(videoView);


                // Set MediaController for VideoView
                videoView.setMediaController(mediaController);
            }


            try {
                // ID of video file.

                String videoUrl="https://www.youtube.com/watch?v=JHdmkP-nfsA";
                videoView.setVideoPath(videoUrl);


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

            videoView.requestFocus();


            // When the video file ready for playback.
            videoView.setOnPreparedListener(new OnPreparedListener() {

                public void onPrepared(MediaPlayer mediaPlayer) {


                    videoView.seekTo(position);
                    if (position == 0) {
                        videoView.start();
                    }

                    // When video Screen change size.
                    mediaPlayer.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
                        @Override
                        public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {

                            // Re-Set the videoView that acts as the anchor for the MediaController
                            mediaController.setAnchorView(videoView);
                        }
                    });
                }
            });

        }

    }

谁能帮帮我?

先谢谢大家!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

logcat的:

Couldn't open https://www.youtube.com/watch?v=JHdmkP-nfsA: java.io.FileNotFoundException: No content provider: https://www.youtube.com/watch?v=JHdmkP-nfsA
10-29 12:27:28.419 25932-25932/com.example.marco.ud D/MediaPlayer: setDataSource IOException | SecurityException happend : 
                                                                   java.io.FileNotFoundException: No content provider: https://www.youtube.com/watch?v=JHdmkP-nfsA
                                                                       at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1137)
                                                                       at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:988)
                                                                       at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:911)
                                                                       at android.media.MediaPlayer.attemptDataSource(MediaPlayer.java:1102)
                                                                       at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1093)
                                                                       at android.widget.VideoView.openVideo(VideoView.java:356)
                                                                       at android.widget.VideoView.-wrap0(VideoView.java)
                                                                       at android.widget.VideoView$7.surfaceCreated(VideoView.java:632)
                                                                       at android.view.SurfaceView.updateWindow(SurfaceView.java:656)
                                                                       at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:172)
                                                                       at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:1013)
                                                                       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2510)
                                                                       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1519)
                                                                       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7113)
                                                                       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927)
                                                                       at android.view.Choreographer.doCallbacks(Choreographer.java:702)
                                                                       at android.view.Choreographer.doFrame(Choreographer.java:638)
                                                                       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913)
                                                                       at android.os.Handler.handleCallback(Handler.java:751)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:154)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6780)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

5 个答案:

答案 0 :(得分:2)

VideoView.setVideoPath需要设备上的本地路径。如果你想玩远程MP4或其他东西,你应该试试setVideoURIVideoView Documentation

如果您想在自己的应用中嵌入YouTube视频,请考虑使用YouTube Android Player API或使用类似WebView

的内容

答案 1 :(得分:1)

您无法直接将 YouTube 视频播放到 VideoView ExoPlayer ,因此,首先您需要下载视频然后再设置该视频的语言环境路径为方法VideoView.setVideoPath("path")

如果您只想播放 YouTube 视频,请使用YouTube Android Player API,如果您只想播放其他远程视频(.mp4,.ogg,.3gp等),请使用方法VideoView.setVideoURI("uri")

示例 -

String videoUrl = "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4";

try {
        // Start the MediaController
        MediaController mediacontroller = new MediaController(this);
        mediacontroller.setAnchorView(videoview);
        // Get the URL from String videoUrl
        Uri video = Uri.parse(videoUrl);
        videoview.setMediaController(mediacontroller);
        videoview.setVideoURI(video);

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

videoview.setOnPreparedListener(new OnPreparedListener() {
        public void onPrepared(MediaPlayer mp) {
            videoview.start();
        }
    });

答案 2 :(得分:1)

我建议使用ExoPlayer代替 VideoView

app gradle:

implementation 'com.google.android.exoplayer:exoplayer:2.10.8'

布局xml:

<com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true" />

java代码:

PlayerView videoView = findViewById(R.id.video_view);
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this);
videoView.setPlayer(player);
// Produces DataSource instances through which media data is loaded.
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "yourApplicationName"));
// This is the MediaSource representing the media to be played.
MediaSource videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(fileEntity.getPath()));
// Prepare the player with the source.
player.prepare(videoSource);
player.setPlayWhenReady(true); 

答案 3 :(得分:0)

您使用的是VideoView

  

显示视频文件。 VideoView类可以从中加载图像   各种来源(如资源或内容提供商)。

您可能想尝试setVideoURI

或者:ExoPlayer如果min SDK&gt; 16

或使用SurfaceView

SurfaceView surfaceView = (SurfaceView)findViewById(R.id.surfaceView);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(new SurfaceHolder.Callback() {

@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
           mediaPlayer.setDataSource(STREAM_URL);
           mediaPlayer.setDisplay(surfaceHolder);
           mediaPlayer.start();
}

参考:https://developer.android.com/reference/android/widget/VideoView.html

答案 4 :(得分:0)

我有同样的问题,但这是由于公司代理服务器。我在移动互联网上使用了相同的应用程序,并且开始工作。希望它可以节省别人的时间