文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android混合开发之H5调用系统相机和相册

2022-06-06 13:11

关注

曾经接触一个项目,需要利用H5显示页面,于是自然而然想到了WebView。又由于Android系统自带的WebView被人吐槽过多,所以决定使用腾讯封装的X5内核的WebView,使用和方法上和系统的相差不大。

第一步:在布局中使用WebView。



我们设置一个progressbar用来提示加载进度,我想从用户体验上来说还是很必要的。

第二步:WebActivity开始初始化progressbar。


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);
        webview = findViewById(R.id.wv);
        initProgressBar();
        init();
    }

private void initProgressBar() {
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
        mProgressBar.setMax(100);
        mProgressBar.setProgressDrawable(this.getResources().getDrawable(R.drawable.color_progressbar));
    }


    
    

第三步:初始化WebView。


private void init() {
        initWebview("https://...");
}
private void initWebview(String data) {
        com.tencent.smtt.sdk.WebSettings webSettings = webview.getSettings();
        //加载需要显示的网页
        MyWebChromeClient myWebChromeClient = new MyWebChromeClient();
        webview.setWebChromeClient(myWebChromeClient);
        webview.loadUrl(data);
        //    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setUseWideViewPort(true);//关键点
        webSettings.setLoadWithOverviewMode(true);
        //    webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
        //    webSettings.setDisplayZoomControls(false);
        webSettings.setJavaScriptEnabled(true); // 设置支持javascript脚本
        webSettings.setAllowFileAccess(true); // 允许访问文件
        webSettings.setBuiltInZoomControls(true); // 设置显示缩放按钮
        webSettings.setSupportZoom(true); // 支持缩放
        webSettings.setDomStorageEnabled(true);
        webSettings.setAllowFileAccess(true);
        webSettings.setLoadsImagesAutomatically(true);
        //    webview.setScrollBarStyle(0);
        webview.setWebViewClient(new com.tencent.smtt.sdk.WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                //  重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
                view.loadUrl(url);
                return true;
            }
        });
    }
  public class MyWebChromeClient extends com.tencent.smtt.sdk.WebChromeClient {
    @Override
    public void onProgressChanged(com.tencent.smtt.sdk.WebView view, int newProgress) {
        //监听页面加载进度
//		            ProgressBar progressbar = webView.getProgressbar();
        if (newProgress == 100) {
            // 加载完成隐藏进度条
            mProgressBar.setVisibility(View.GONE);
        } else {
            mProgressBar.setVisibility(View.VISIBLE);
            mProgressBar.setProgress(newProgress);
        }
        super.onProgressChanged(view, newProgress);
    }
      @Override
      public boolean onShowFileChooser(com.tencent.smtt.sdk.WebView webView, ValueCallback valueCallback, FileChooserParams fileChooserParams) {
          if (mUploadMessage != null) {
              mUploadMessage.onReceiveValue(null);
          }
          mUploadMessage = valueCallback;
          take(fileChooserParams);
          return true;
      }
      @Override
      public void openFileChooser(ValueCallback valueCallback, String s, String s1) {
          mValueCallbackTake = valueCallback;
          take();
      }
  }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == FILECHOOSER_RESULTCODE) {
            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
            if (result == null&&imageUri==null) {
                mUploadMessage.onReceiveValue(null);
                mUploadMessage = null;
                return;
            }
            if (mUploadMessage != null&&result != null){
                String path =  FileUtils.getPath(this, result);
                if (TextUtils.isEmpty(path)) {
                    mUploadMessage.onReceiveValue(null);
                    mUploadMessage = null;
                    return;
                }
                Uri u = Uri.fromFile(new File(path));
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    mUploadMessage.onReceiveValue(new Uri[]{u});
                }
                mUploadMessage = null;
            } else{
                if (imageUri != null) {
                   
                    mUploadMessage
                            .onReceiveValue(new Uri[]{imageUri});
                } else {
                    mUploadMessage.onReceiveValue(new Uri[]{imageUri});
                }
                mUploadMessage = null;
            }
        }
    }

public void take(WebChromeClient.FileChooserParams fileChooserParams){
        File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");
        // Create the storage directory if it does not exist
        if (! imageStorageDir.exists()){
            imageStorageDir.mkdirs();
        }
        File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");
        imageUri = Uri.fromFile(file);
        final List cameraIntents = new ArrayList();
        final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        Uri mCameraTempUri;
        ContentValues values = new ContentValues(1);
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");
        values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
        mCameraTempUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        captureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        if (mCameraTempUri != null) {
            captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCameraTempUri);
            captureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        }
        final PackageManager packageManager = getPackageManager();
        final List listCam = packageManager.queryIntentActivities(captureIntent, 0);
        for(ResolveInfo res : listCam) {
            final String packageName = res.activityInfo.packageName;
            final Intent i = new Intent(captureIntent);
            i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
            i.setPackage(packageName);
            i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            cameraIntents.add(i);
        }
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.addCategory(Intent.CATEGORY_OPENABLE);
        if (fileChooserParams != null && fileChooserParams.getAcceptTypes() != null
                && fileChooserParams.getAcceptTypes().length > 0) {
            i.setType(fileChooserParams.getAcceptTypes()[0]);
        } else {
            i.setType("*/*");
        }
        Intent chooserIntent = Intent.createChooser(i,"请选择:");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
        startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
    }

作者:AD钙奶-lalala


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯