当前位置:   article > 正文

Android WebView 选择图片并上传(调用相机拍照/相册/选择文件)_安卓 webview 上次图片

安卓 webview 上次图片

前言:

这个功能其实我才刚接触。不熟...在这个给大家提供的都是经过本人验证之后的一些案例。可以在项目中跑的。

最近项目嵌入混合开发,都是使用WebView来跳转,页面展示。有用到这个图片上传的功能。

原本是一脸懵的,查了很多资料看一些大神都写的很多代码很复杂(原谅我是小白)

正文:

先看一下效果先:

代码:

我这里代码都是写在Fragment里面的 直接看 initWeb()方法就好了

  1. /**
  2. * Created by WL-鬼 on 2017/7/10.
  3. */
  4. public class WebFragment extends BaseFragment {
  5. private String webUrl = APIConstants.WEB_ROOT + "index.php";
  6. private static volatile WebFragment webFragment;
  7. @BindView(R.id.h5WebView)
  8. WebView h5WebView;
  9. @BindView(R.id.tribal_web_progressbar)
  10. ProgressBar webProgressBar;
  11. public ValueCallback<Uri[]> mUploadMessageForAndroid5;
  12. public ValueCallback<Uri> mUploadMessage;
  13. public final static int FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5 = 2;
  14. private final static int FILE_CHOOSER_RESULT_CODE = 1;// 表单的结果回调
  15. private Uri imageUri;
  16. @Override
  17. public int getLayoutRes() {
  18. return R.layout.fragment_web;
  19. }
  20. @Override
  21. public void init(Bundle savedInstanceState) {
  22. initWeb();
  23. }
  24. @Override
  25. public void initEvent() {
  26. }
  27. // 初始化webview
  28. @SuppressLint("SetJavaScriptEnabled")
  29. private void initWeb() {
  30. WebSettings mWebSettings = h5WebView.getSettings();
  31. mWebSettings.setJavaScriptEnabled(true); //允许加载javaScript
  32. mWebSettings.setSupportZoom(true); //是否允许缩放
  33. mWebSettings.setUseWideViewPort(true); //设置加载进来的页面自适应手机屏幕
  34. mWebSettings.setLoadWithOverviewMode(true);
  35. mWebSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
  36. mWebSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
  37. h5WebView.canGoBack();
  38. h5WebView.loadUrl(webUrl);
  39. //H5加载链接监听
  40. h5WebView.setWebViewClient(new WebViewClient() {
  41. @Override
  42. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  43. Intent intent = null;
  44. //根据拦截的url来判断是否拦截跳转
  45. if (url.contains("test")) {
  46. intent = new Intent(getContext(), Test.class);
  47. } else if (url.contains("returnBackController")) {
  48. ...
  49. }else if (url.contains("....")) {
  50. h5WebView.loadUrl("javascript:reload()");
  51. }else {
  52. h5WebView.loadUrl(webUrl);
  53. }
  54. if (intent != null){
  55. startActivity(intent);
  56. }
  57. return true;
  58. }
  59. @Override
  60. public void onPageStarted(WebView view, String url, Bitmap favicon) {
  61. super.onPageStarted(view, url, favicon);
  62. }
  63. @Override
  64. public void onPageFinished(WebView view, String url) {
  65. super.onPageFinished(view, url);
  66. }
  67. });
  68. //H5界面加载进度监听
  69. h5WebView.setWebChromeClient(new WebChromeClient(){
  70. @Override
  71. public void onProgressChanged(WebView view, int newProgress) {
  72. if (webProgressBar != null){
  73. if (newProgress > 95){
  74. webProgressBar.setVisibility(View.GONE);
  75. }else if (newProgress < 95 && webProgressBar.getVisibility() == View.GONE){
  76. webProgressBar.setVisibility(View.VISIBLE);
  77. }
  78. webProgressBar.setProgress(newProgress);
  79. }
  80. super.onProgressChanged(view, newProgress);
  81. }
  82. // For Android < 5.0
  83. public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
  84. openFileChooserImpl(uploadMsg);
  85. }
  86. // For Android => 5.0
  87. public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> uploadMsg,
  88. WebChromeClient.FileChooserParams fileChooserParams) {
  89. onenFileChooseImpleForAndroid(uploadMsg);
  90. return false;
  91. }
  92. });
  93. /**
  94. * 监听手机返回按键,点击返回H5就返回上一级
  95. */
  96. h5WebView.setOnKeyListener(new View.OnKeyListener() {
  97. @Override
  98. public boolean onKey(View v, int keyCode, KeyEvent event) {
  99. if ((keyCode == KeyEvent.KEYCODE_BACK) && h5WebView.canGoBack()) {
  100. h5WebView.goBack();
  101. return true;
  102. }
  103. return false;
  104. }
  105. });
  106. }
  107. /**
  108. * android 5.0 以下开启图片选择(原生)
  109. *
  110. * 可以自己改图片选择框架。
  111. */
  112. private void openFileChooserImpl(ValueCallback<Uri> uploadMsg) {
  113. mUploadMessage = uploadMsg;
  114. Intent i = new Intent(Intent.ACTION_GET_CONTENT);
  115. i.addCategory(Intent.CATEGORY_OPENABLE);
  116. i.setType("image/*");
  117. startActivityForResult(Intent.createChooser(i, "File Chooser"), FILE_CHOOSER_RESULT_CODE);
  118. }
  119. /**
  120. * android 5.0(含) 以上开启图片选择(原生)
  121. *
  122. * 可以自己改图片选择框架。
  123. */
  124. private void onenFileChooseImpleForAndroid(ValueCallback<Uri[]> filePathCallback) {
  125. mUploadMessageForAndroid5 = filePathCallback;
  126. Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
  127. contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
  128. contentSelectionIntent.setType("image/*");
  129. Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
  130. chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
  131. chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");
  132. startActivityForResult(chooserIntent, FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5);
  133. }
  134. @Override
  135. public void onActivityResult(int requestCode, int resultCode,Intent intent) {
  136. Uri result = (intent == null || resultCode != Activity.RESULT_OK) ? null: intent.getData();
  137. switch (requestCode){
  138. case FILE_CHOOSER_RESULT_CODE: //android 5.0以下 选择图片回调
  139. if (null == mUploadMessage)
  140. return;
  141. mUploadMessage.onReceiveValue(result);
  142. mUploadMessage = null;
  143. break;
  144. case FILE_CHOOSER_RESULT_CODE_FOR_ANDROID_5: //android 5.0(含) 以上 选择图片回调
  145. if (null == mUploadMessageForAndroid5)
  146. return;
  147. if (result != null) {
  148. mUploadMessageForAndroid5.onReceiveValue(new Uri[]{result});
  149. } else {
  150. mUploadMessageForAndroid5.onReceiveValue(new Uri[]{});
  151. }
  152. mUploadMessageForAndroid5 = null;
  153. break;
  154. }
  155. }else {//这端必须要加的,避免重复调起相册,没反应的问题
  156. if (mUploadMessage != null){
  157. mUploadMessage.onReceiveValue(null);
  158. mUploadMessage = null;
  159. }
  160. if (mUploadMessageForAndroid5 != null){
  161. mUploadMessageForAndroid5.onReceiveValue(null);
  162. mUploadMessageForAndroid5 = null;
  163. }
  164. }
  165. }

这就是所需的权限,记得在AndroidManifest.xml中进行配置.  (这里不知道有没有遗漏)

  1. <uses-permission android:name="android.permission.INTERNET"/>
  2. <uses-permission android:name="android.permission.CAMERA"/>
  3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  4. <uses-feature android:name="android.hardware.camera" /> <!-- 使用照相机权限 -->
  5. <uses-feature android:name="android.hardware.camera.autofocus" /> <!-- 自动聚焦权限 -->
  6. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  7. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

当然这里面是有些缺陷的,例如没有运行时权限、适配Android6.0 - 7.0 。 Android 7.0 开始资源共享问题。

这边文章还有很大的优化、修改的地方的。

(因为国产手机中,一些厂商都是自家深度定制的Android 系统。

所以一些运行时权限是和Google发布的Android 运行时权限是存在一些出入的,在这方面的适配会有些复杂)

另外图片选择不是很建议用原生的,建议还是用第三方的图片选择框架。这就自己看自己的需求改了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/175129
推荐阅读
相关标签
  

闽ICP备14008679号