将实时视频从 Raspberry Pi 流式传输到我的 Android 应用程序但出现安全异常

Streaming live video from Raspberry Pi to my Android App but getting security exception

我想将实时视频流式传输到我的 android 应用程序。 我正在使用动态服务从我的 raspberry pi 的相机(小型 USB 连接相机)流式传输实时视频。我已将其设置为端口 8082,因此我可以从任何浏览器成功输入(示例 IP)“http://74.220.185.125:8082”并查看我的视频流。但是,当我使用 videoView 在我的应用程序代码中使用它时,我每次都会抛出异常。

主要活动:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Starting video
        piVideo = (VideoView) findViewById(R.id.piVidView);

        try{
            piVideo.setVideoURI(Uri.parse("http://74.220.185.125:8082/"));
        } catch (Exception e){
            Log.e("Error found here->", e.getMessage());
            e.printStackTrace();
        }
        piVideo.requestFocus();
        piVideo.start();

        piVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override

            public void onPrepared(MediaPlayer mp) {
                piVideo.start();
            }
        });


    }

每次,我都会得到同样的错误:

03-08 12:46:49.258 1412-1412/com.me.blah.app D/MediaPlayer: setDataSource IOException | SecurityException happend : 
                                                                         java.io.FileNotFoundException: No content provider: http://74.220.185.125:8082/
                                                                             at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1141)
                                                                             at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:991)
                                                                             at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:914)
                                                                             at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1121)
                                                                             at android.widget.VideoView.openVideo(VideoView.java:371)
                                                                             at android.widget.VideoView.access00(VideoView.java:71)
                                                                             at android.widget.VideoView.surfaceCreated(VideoView.java:652)
                                                                             at android.view.SurfaceView.updateWindow(SurfaceView.java:712)
                                                                             at android.view.SurfaceView.onPreDraw(SurfaceView.java:209)
                                                                             at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:1014)
                                                                             at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2510)
                                                                             at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
                                                                             at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397)
                                                                             at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
                                                                             at android.view.Choreographer.doCallbacks(Choreographer.java:695)
                                                                             at android.view.Choreographer.doFrame(Choreographer.java:631)
                                                                             at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
                                                                             at android.os.Handler.handleCallback(Handler.java:739)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                             at android.os.Looper.loop(Looper.java:158)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我在清单文件中启用了互联网:

"uses-permission android:name="android.permission.INTERNET"

我已经尝试了 rstp:// 和 http://,但最终仍然抛出相同的异常。任何人都可以看到我这个异常可能是从哪里引起的吗?

所以我实际上在大约一周前找到了这个简单的解决方案,经过大约两周的搜索和询问,我注意到有很多其他人问同样的问题或寻找一个简单的答案,我想分享什么对我有用。

我的搜索引导我使用 videoView,但根据我的理解 videoView 正在搜索特定文件 and/or 通常创建的特定流式文件类型你的远程服务器。然而,运动服务并没有轻易提供文件或我正在寻找的细节,但 ip 地址在普通浏览器中肯定有效,所以我尝试了一个 webView,调整了 raspberry pi 中 [=] 的像素比率20=] 文件,并使用我的 webView 的尺寸进行播放,它工作得非常好。代码比我一直看到的示例简单得多,这就是我使用的代码:

String piAddr = "http://10.0.0.116:8081/"

mWebView = (WebView) findViewById(R.id.activity_main_webview);
mWebView.loadUrl(piAddr);

注意:我是 运行 一个 python 脚本,它在我的 raspberry pi 上启动动作服务,似乎应用程序请求 raspberry pi 动作之间的时间服务端口和实际启动的运动服务略有关闭,因此在我的整个代码中,我只是定期重复以下行以验证我的视频是否成功传输。

此外,webView 有一个自动滚动条,所以如果您看不到整个视频(计时器在底部),您可以随时在 motion.conf 文件中调整 pi 上的视频尺寸。