Javascript Android WebView不允许加载本地视频文件
我有一个Web视图显示HTML文件的应用程序。在HTML文件中,有一个按钮将请求用户录制视频,或从文档文件夹中选择视频 选择(或录制)视频后,它将调用javascript函数,并将其链接(由Uri编码)到视频文件,然后通过将其设置为源,将其显示在元素中:Javascript Android WebView不允许加载本地视频文件,javascript,android,video,webview,android-contentprovider,Javascript,Android,Video,Webview,Android Contentprovider,我有一个Web视图显示HTML文件的应用程序。在HTML文件中,有一个按钮将请求用户录制视频,或从文档文件夹中选择视频 选择(或录制)视频后,它将调用javascript函数,并将其链接(由Uri编码)到视频文件,然后通过将其设置为源,将其显示在元素中: function showPreview(previewFile){ console.log(previewFile); document.getElementById('previewVideo').src = preview
function showPreview(previewFile){
console.log(previewFile);
document.getElementById('previewVideo').src = previewFile;
}
我遇到了这个错误,我一直在四处寻找,但似乎找不到解决方案:
I/chromium﹕ [INFO:CONSOLE(94)] "content://com.android.providers.media.documents/document/video%3A19961", source: file:///android_asset/index.html (94)
W/MediaResourceGetter﹕ permission denied to access network state
W/MediaResourceGetter﹕ non-file URI can't be read due to unsuitable network conditions
E/MediaResourceGetter﹕ Unable to configure metadata extractor
正如您所看到的,我正在javascript函数中记录视频文件的链接,您可以告诉我content://com.android.providers.media.documents/document/video%3A19961
这就是我在代码中加载WebView的方式(当然,XML中也有相应的WebView):
Javascript接口函数&回调
调用javascript链接选定/录制的视频文件:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
LogUtils.log(LogUtils.DEBUG, "onActivityResult called: " + requestCode + " ," + resultCode);
if (requestCode == CAMERA_CAPTURE_RESULT) {
// Test if the WebView is loaded:
if (webView != null) {
LogUtils.log(LogUtils.DEBUG, "Calling javascript to set preview video.");
webView.loadUrl("javascript: showPreview('" + Uri.encode(data.getData().toString()) + "');");
}
}
}
AndroidManifest.xml
这是我的清单,因为我假设权限可能在其中起作用
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tomspee.comingsoon" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permissions.READ_EXTERNAL_STORAGE" />
<application
android:hardwareAccelerated="true"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
意识到这是一个古老的问题,在我自己的问题中解决它。我想我会应用一些答案 首先,读取外部存储是“权限”,而不是“权限” 第二,webview显然也需要清单中的ACCESS\u NETWORK\u STATE权限,以及某些类型的媒体播放流系统查看网络状态并尝试预取流的元数据。此外,MediaResourceGetter错误将消失 另外,与我的问题无关,我已经看到某些URL结构可能适用于webview本身,但不适用于其他子系统。不确定content://是否是其中之一 希望这能帮助别人
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
LogUtils.log(LogUtils.DEBUG, "onActivityResult called: " + requestCode + " ," + resultCode);
if (requestCode == CAMERA_CAPTURE_RESULT) {
// Test if the WebView is loaded:
if (webView != null) {
LogUtils.log(LogUtils.DEBUG, "Calling javascript to set preview video.");
webView.loadUrl("javascript: showPreview('" + Uri.encode(data.getData().toString()) + "');");
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tomspee.comingsoon" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permissions.READ_EXTERNAL_STORAGE" />
<application
android:hardwareAccelerated="true"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>