gpt4 book ai didi

javascript - Android WebView 不允许加载本地视频文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:44:27 27 4
gpt4 key购买 nike

我有一个带有显示 HTML 文件的 WebView 的应用程序。在 HTML 文件中,有一个按钮会要求用户录制视频,或从他的文档文件夹中选择一个视频。

在选择(或录制)视频后,它会调用带有视频文件链接(由 Uri 编码)的 javascript 函数,然后通过将其设置为源来将其显示在元素中:

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):

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

webView = (WebView) this.findViewById(R.id.webView);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
webView.addJavascriptInterface(new CSJSInterface(getApplicationContext()), "jsInterface");
webView.loadUrl("file:///android_asset/index.html");
}

Javascript 接口(interface)函数和回调

 @JavascriptInterface
public void showCapture() {
File imageStorageDir = new File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
, CS_MOVIE_DIRECTORY);

// Create the directory if needed:
if (!imageStorageDir.exists()) {
imageStorageDir.mkdirs();
}

// Create camera captured image file path and name
File file = new File(
imageStorageDir + File.separator + "MOV_"
+ String.valueOf(System.currentTimeMillis())
+ ".mp4");
mCapturedImageURI = Uri.fromFile(file);
// Camera capture image intent
final Intent captureIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("video/*");

// Create file chooser intent
Intent chooserIntent = Intent.createChooser(i, "Video Chooser");

// Set camera intent to file chooser
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{captureIntent});

// On select image call onActivityResult method of activity
startActivityForResult(chooserIntent, CAMERA_CAPTURE_RESULT);
}

调用 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

这是我的 list ,因为我假设权限可能发挥了作用

<?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>

最佳答案

意识到这是旧的,解决了我自己的问题。以为我会应用一些答案。

首先,READ_EXTERNAL_STORAGE 是“权限”,而不是“权限”。

其次,webview 显然也需要 list 中的 ACCESS_NETWORK_STATE 权限,因为某些类型的媒体播放流系统会查看网络状态并尝试为流预取元数据。添加一点,MediaResourceGetter 错误将消失。

另外,与我的问题无关,我发现某些 URL 结构可能适用于 webview 本身,但不适用于其他子系统。不确定 content://是否是其中之一......

希望对某人有所帮助。

关于javascript - Android WebView 不允许加载本地视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27876749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com