当前位置: 首页 > 知识库问答 >
问题:

Android Studio Webview不调用照片库

澹台俊达
2023-03-14

在我的Web应用程序中,我正在加载一个页面,其中有一个按钮可以调用相册/照片库,但它根本不工作。请帮忙,这是我目前的代码。

webView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.setWebViewClient(new WebViewClient());
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setLoadWithOverviewMode(true);
        webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        webView.setScrollbarFadingEnabled(false);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setPluginState(WebSettings.PluginState.ON);
        webView.getSettings().setAllowFileAccess(true);
        webView.getSettings().setSupportZoom(true);
        webView.addJavascriptInterface(new MyJavascriptInterface(this), "Android");
        webView.loadUrl("https://URL/");

并在现场创建

class MyJavascriptInterface
{

    Context mContext;

    /** Instantiate the interface and set the context */
    MyJavascriptInterface(Context c)
    {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast)
    {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }

    @JavascriptInterface
    public String choosePhoto()
    {
        // TODO Auto-generated method stub
        String file = "test";
        Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
        photoPickerIntent.setType("image/*");
        startActivityForResult(photoPickerIntent, SELECT_PHOTO);
        return file;
    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
    switch (requestCode)
    {
        case SELECT_PHOTO:
            if (resultCode == RESULT_OK)
            {
                Uri selectedImage = intent.getData();
                webView.loadUrl("javascript:setFileUri('" + selectedImage.toString() + "')");
                String path = getRealPathFromURI(this, selectedImage);
                webView.loadUrl("javascript:setFilePath('" + path + "')");
            }
    }

}

public String getRealPathFromURI(Context context, Uri contentUri)
{
    Cursor cursor = null;
    try
    {
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    finally
    {
        if (cursor != null)
        {
            cursor.close();
        }
    }
}

在清单文件里

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />

我需要访问照片/相机,使用简单的网络视图从图库中选择图像。请原谅我的英语和代码,因为我还是一个学习者,对android开发还不熟悉。

共有1个答案

干鑫鹏
2023-03-14

我认为你最好在WebChromeClient$onShowFileChooser中这样做。

在你的代码中,你应该在主线程中这样做。试着在你选择的照片方法中添加runOnUIThread。

在这里添加演示(构建。VERSION_CODES在LOLLIPOP下面使用不同的方法):

public class MyChromeCientWithFileChooser extends WebChromeClient implements ActivityResultCaseDelegate {

private int FILE_CHOOSER_REQUEST_CODE = 1001;

private Activity activity;
private ValueCallback<Uri[]> filePathCallback;
private Uri mediaUri;

public MyChromeCientWithFileChooser(Activity activity) {
    this.activity = activity;
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
    String type;
    if (fileChooserParams != null && fileChooserParams.getAcceptTypes() != null && fileChooserParams.getAcceptTypes().length > 0) {
        type = !TextUtils.isEmpty(fileChooserParams.getAcceptTypes()[0]) ? fileChooserParams.getAcceptTypes()[0] : "*/*" ;
        this.filePathCallback = filePathCallback;
    } else {
        return false;
    }
    proceedOnType(type, fileChooserParams.isCaptureEnabled());
    return true;
}

private void proceedOnType(String type, final boolean isCaptureEnabled) {
    if (type.toLowerCase().contains("image")) {
        pickImage(isCaptureEnabled); // need to make sure you have "android.permission.CAMERA", "android.permission.WRITE_EXTERNAL_STORAGE" permission
    } else if (type.toLowerCase().contains("video")) {
        makeVideo(); // need to make sure you have "android.permission.CAMERA", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.RECORD_AUDIO" permission
    } else {
        openDefaultChooser(type); // need to make sure you have "android.permission.WRITE_EXTERNAL_STORAGE" permission
    }
}

private void openDefaultChooser(String type) {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.addCategory(Intent.CATEGORY_OPENABLE);
    i.setType(type);
    activity.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILE_CHOOSER_REQUEST_CODE);
}

private void pickImage(boolean captureOnly) {
    if (captureOnly) {
        Intent iImageCapture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        mediaUri = Uri.fromFile(new File(getImageCaptureCachePath()));
        iImageCapture.putExtra("output", mediaUri);
        activity.startActivityForResult(Intent.createChooser(iImageCapture, "Image Chooser"), FILE_CHOOSER_REQUEST_CODE);
    } else {
        Intent iChooseImage = new Intent(Intent.ACTION_GET_CONTENT);
        iChooseImage.addCategory(Intent.CATEGORY_OPENABLE);
        iChooseImage.setType("image/*");

        Intent iImageCapture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        mediaUri = Uri.fromFile(new File(getImageCaptureCachePath()));
        iImageCapture.putExtra("output", mediaUri);

        Intent iChooser = Intent.createChooser(iChooseImage, "Pick a photo");
        iChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{iImageCapture});

        activity.startActivityForResult(Intent.createChooser(iChooser, "Image Chooser"), FILE_CHOOSER_REQUEST_CODE);
    }
}

private void makeVideo() {
    Intent iImageCapture = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    mediaUri = Uri.fromFile(new File(getVideoCaptureCachePath()));
    iImageCapture.putExtra("output", mediaUri);
    activity.startActivityForResult(Intent.createChooser(iImageCapture, "Image Chooser"), FILE_CHOOSER_REQUEST_CODE);
}

private String getImageCaptureCachePath() {
    return "cahced_photo_" + System.currentTimeMillis() + ".jpg";
}

private String getVideoCaptureCachePath() {
    return "cahced_video_" + System.currentTimeMillis() + ".mp4"; 
}

private void cleanCacheUri() {
    filePathCallback = null;
    mediaUri = null;
}

@Override
public int caseRequestCode() {
    return FILE_CHOOSER_REQUEST_CODE;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (filePathCallback == null) {
        return;
    }
    if (resultCode != RESULT_OK) {
        filePathCallback.onReceiveValue(null);
        cleanCacheUri();
        return;
    }
    Uri result = data == null ? null : data.getData();
    handleResultAboveLollipop(result);
    cleanCacheUri();
}

private void handleResultAboveLollipop(Uri result) {
    if (filePathCallback == null) {
        return;
    }
    if (result != null) {
        // handle image choose from file
        String path = WebFileChooseHelper.getPath(activity, result);
        if (TextUtils.isEmpty(path)) {
            filePathCallback.onReceiveValue(null);
            return;
        }

        Uri uri;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Context appContext = TJAppScopeComponents.getAppContext();
            uri = FileProvider.getUriForFile(appContext, appContext.getPackageName() + ".provider", new File(path));
        } else {
            uri = Uri.fromFile(new File(path));
        }

        filePathCallback.onReceiveValue(new Uri[]{uri});
    } else {
        // handle capture
        filePathCallback.onReceiveValue(new Uri[]{mediaUri});
    }
}
}

和ActivityResultCase委托:

public interface ActivityResultCaseDelegate {
int caseRequestCode();
void onActivityResult(int requestCode, int resultCode, Intent data);
}

您可以使用此添加onActivityResult案例。

在html中:

<input type="file" accept="image/*" capture="camera">
 类似资料:
  • 在PlayStation®Store上寻找与照片相关的信息。 可在PlayStation®Store寻找游戏的截图等,与该照片相关的信息。 使用阅览器显示想寻找信息的照片,并轻触(选项)>[在PlayStation®Store中寻找]。 依照片不同,可能无法寻找信息。在此情况下,不会显示此选项。 修剪照片 可删除照片上下左右不需要的部分,仅保留需要的部分。 使用阅览器显示要修剪的照片,并轻触(选项

  • 可拍摄及观赏照片的应用程序。 照片的LiveArea™ 拍摄照片 观赏照片 活用照片 可在照片程序显示的文件类型

  • 喂, 我使用一个webview,上面有一个按钮,可以浏览应用程序的照片库。 但是,当在webview中单击该按钮时,什么也不会发生。 url的格式为: 我已添加以下权限: 我有一个片段,它将在启用javascript的onCreateView方法(仅限代码段)中加载webview。

  • Since 8.1 photo 拍照/选择照片 不推荐使用,建议使用新的chooseImage接口 使用方法 AlipayJSBridge.call('photo', { dataType: 'dataURL', imageFormat: 'jpg', quality: 75, maxWidth: 500, maxHeight: 500, allowEdit: true,

  • 可依月份排列,或拍摄/输入的图像(相机图像)等分类选择显示照片。 A ) (摄影模式) 轻触图标可启动相机,切换为摄影模式。 若连接PS3™或电脑,列表上会追加[PS3™]或[电脑]分类,亦可显示各分类中保存的内容。* * PS Vita可播放的文件类型有限。 若轻触内容,会以全屏显示。 操作键等在数秒钟后会自动隐藏,若想再次显示请轻触屏幕。 A ) (删除)/(幻灯片播放)/(上一张)/(下一张

  • 可使用前端相机或背面相机拍摄照片。 A ) (显示模式) 轻触图标可切换为显示模式。 B ) (位置数据)/(切换相机)/(切换图像大小) 启用位置数据的使用设定即可显示(位置数据)。轻触图标可使用Wi-Fi、GPS*、手机基地台*的信息取得位置数据。取得后会显示(已取得位置数据),拍摄照片时会同时记录位置数据。 * 仅限3G/Wi-Fi机种 C ) (快门) 轻触图标可拍摄照片。 D ) 已拍摄