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;
       }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章