webView 混淆上传无响应问题

涉及到不同版本的API的兼容性问题,openFileChooser需要实现以下:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.  // 添加事件  
  2.     mWebView.setWebChromeClient(new WebChromeClient() {  
  3.   
  4.         @SuppressWarnings("unused")  
  5.         public void openFileChooser(ValueCallback<Uri> uploadFile) {  
  6.             uploadFile(uploadFile);  
  7.         }  
  8.   
  9.         @SuppressWarnings("unused")  
  10.         public void openFileChooser(ValueCallback<Uri> uploadFile,  
  11.                 String acceptType) {  
  12.             uploadFile(uploadFile);  
  13.         }  
  14.   
  15.         @SuppressWarnings("unused")  
  16.         public void openFileChooser(ValueCallback<Uri> uploadFile,  
  17.                 String acceptType, String capture) {  
  18.             uploadFile(uploadFile);  
  19.         }  
  20.   
  21.     });  
  22.   
  23.      // 上传文件  
  24.     private ValueCallback<Uri> mUploadMessage;  
  25.     private void uploadFile(ValueCallback<Uri> uploadFile) {  
  26.     mUploadMessage = uploadFile;  
  27.     Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
  28.     i.addCategory(Intent.CATEGORY_OPENABLE);  
  29.     i.setType("image/*");  
  30.     startActivityForResult(Intent.createChooser(i, "File Chooser"),  
  31.             FILE_CHOOSER_CODE);  
  32. }  
  33.   
  34.       // 结果回传  
  35.       @Override  
  36. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  37.     super.onActivityResult(requestCode, resultCode, data);  
  38.     if (requestCode == FILE_CHOOSER_CODE) {  
  39.         if (mUploadMessage == null)  
  40.             return;  
  41.         if (data != null && resultCode == RESULT_OK) {  
  42.             Uri result = data.getData();  
  43.             if (result != null) {  
  44.                 mUploadMessage.onReceiveValue(result);  
  45.                 mUploadMessage = null;  
  46.             }  
  47.         }  
  48.     }  


以上是文件上传的过程,重写不同版本的openFileChooser实现上传,然后在onActivityResult中
onReceiveValue将结果回馈给 Js端。以下是混淆相关:

    1)为了避免Js调用在混淆后失效,需要添加以下混淆(将Js调用类保持不混淆)
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. -keepclassmembers class com.umai.taok.manager.JSBridge$AndroidAPI {  
  2.            public *;  
  3.       }  
  4.     -keepclassmembers class com.umai.taok.manager.ClientAPI {  
  5.           public *;  
  6.      }  
  7.      -keep class com.umai.taok.manager.JSBridge$AndroidAPI {  
  8.           public *;  
  9.      }  
  10.      -keep class com.umai.taok.manager.ClientAPI {  
  11.          public *;  
  12.       }  
  13.   
  14.     -keepattributes *Annotation*    
  15.     -keepattributes *JavascriptInterface*   

   2)为了使WebView上传文件能顺利执行,需要添加以下混淆(保持openFileChooser方法不混淆)
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. -keepclassmembers class * extends android.webkit.WebChromeClient {  
  2.             public void openFileChooser(...);  
  3.       }  

关于文件上传只执行第一次解决办法

     经实验得知,关于openFileChooser上传文件只执行第一次问题,引起的原因是在文件第二次选择返回结果后,或者在选择文件取消操作之后,不能有效的向Js传递结果。所以对应的解决办法就是:
1)在传递对象为空时,将null的结果传递到Js端
       
mUploadMessage.onReceiveValue(null);
      mUploadMessage = null;
2)在onActivityResult中判断取消动作,并将null结果传递到Js端 
       
if (resultCode == 0) {
   // 取消
   mUploadMessage.onReceiveValue(null);
   mUploadMessage = null;
       }

在Android应用程序中,WebView是一个常用的控件,用于在应用程序中显示网页。在混淆代码时,需要注意WebView混淆问题。以下是一些混淆WebView时需要注意的事项: 1.在proguard-rules.pro文件中添加以下代码,以避免WebView混淆: ```proguard -keepclassmembers class fqcn.of.javascript.interface.for.webview { public *; } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); public boolean *(android.webkit.WebView, java.lang.String); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponse); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.WebResourceRequest); } -keepclassmembers class * extends android.webkit.WebViewClient { public android.webkit.WebResourceResponse *(android.webkit.WebView, java.lang.String, java.lang.String); } -keepclassmembers class * extends android.webkit.WebViewClient { public android.webkit.WebResourceResponse *(android.webkit.WebView, android.webkit.WebResourceRequest); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.WebBackForwardList); } -keepclassmembers class * extends android.webkit.WebViewClient { public boolean *(android.webkit.WebView, android.view.KeyEvent); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.net.http.SslError); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.ClientCertRequest); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.HttpAuthHandler, java.lang.String, java.lang.String); } -keepclassmembers class * extends android.webkit.WebViewClient { public boolean *(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.WebResourceRequest, android.os.Bundle); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError, android.webkit.WebResourceResponse); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponse, android.os.Bundle); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponse, android.webkit.WebResourceError); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponse, android.webkit.WebResourceError, android.os.Bundle); } ``` 2.在WebViewClient实例中,需要保留onPageFinished()方法中的代码,以确保WebView正确加载图片。具体代码如下: ```java @Override public void onPageFinished(WebView view, String url) { if(!webView.getSettings().getLoadsImagesAutomatically()) { webView.getSettings().setLoadsImagesAutomatically(true); } } ``` 3.在WebView初始化时,需要设置加载图片的选项。具体代码如下: ```java public void init() { if(Build.VERSION.SDK_INT >= 19) { webView.getSettings().setLoadsImagesAutomatically(true); } else { webView.getSettings().setLoadsImagesAutomatically(false); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值