web-dev-qa-db-ja.com

java.io.FileNotFoundException:コンテンツプロバイダーがありません:

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
Bella

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

VideoView.setVideoPathには、デバイス上のローカルパスが必要です。リモートのMP4などを再生したい場合は、代わりにsetVideoURIを試してください。 VideoViewドキュメント

アプリにYouTube動画を埋め込む場合は、 YouTube Android Player API を使用するか、WebViewのようなものを使用することを検討してください

2
damian

同じ問題がありましたが、それは企業のプロキシサーバーが原因でした。モバイルインターネットで同じアプリを使用したところ、機能し始めました。それが誰かの時間を節約することを願っています

1
Hitesh Sahu

VideoViewの代わりに ExoPlayer を使用することをお勧めします:

アプリグラドル:

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); 
1
Huy Miracle

VideoViewを使用しています

ビデオファイルを表示します。 VideoViewクラスは、さまざまなソース(リソースやコンテンツプロバイダーなど)から画像を読み込むことができます。

setVideoURIを試してみてください

または: ExoPlayer 最小SDK> 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

0
Nilesh Deokar