浏览代码

解决webview无法上传文件的问题,切换大按钮直接回到主页面。

Axion 7 年之前
父节点
当前提交
ec06cf6d15

+ 4 - 0
app/proguard-rules.pro

@@ -19,3 +19,7 @@
 # If you keep the line number information, uncomment this to
 # hide the original source file name.
 #-renamesourcefileattribute SourceFile
+
+-keepclassmembers class * extends android.webkit.WebChromeClient{
+    public void openFileChooser(...);
+}

+ 3 - 1
app/src/main/java/com/wiipu/peopleheart/MainActivity.java

@@ -8,6 +8,7 @@ import android.support.annotation.IdRes;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
+import android.util.Log;
 import android.view.KeyEvent;
 import android.view.View;
 import android.widget.FrameLayout;
@@ -108,8 +109,9 @@ public class MainActivity extends BaseActivity implements RadioGroup.OnCheckedCh
         }
     }
 
-    private void setFragment(int fragmentId) {
 
+
+    private void setFragment(int fragmentId) {
         if (mCurFragmentId != fragmentId) {
             FragmentManager fm = getSupportFragmentManager();
             FragmentTransaction ft = fm.beginTransaction();

+ 110 - 0
app/src/main/java/com/wiipu/peopleheart/cases/CaseFragment.java

@@ -1,10 +1,18 @@
 package com.wiipu.peopleheart.cases;
 
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.ClipData;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 import android.widget.ImageView;
@@ -20,6 +28,8 @@ import butterknife.ButterKnife;
 import butterknife.OnClick;
 import butterknife.Unbinder;
 
+import static android.app.Activity.RESULT_OK;
+
 
 public class CaseFragment extends BaseMvpFragment {
 
@@ -34,6 +44,10 @@ public class CaseFragment extends BaseMvpFragment {
     @BindView(R.id.ll_case)
     RelativeLayout llCase;
 
+    private ValueCallback<Uri> uploadMessage;
+    private ValueCallback<Uri[]> uploadMessageAboveL;
+    private final static int FILE_CHOOSER_RESULT_CODE = 10000;
+    private boolean needClearHistory = false;
     @Override
     protected void attach() {
 
@@ -50,6 +64,17 @@ public class CaseFragment extends BaseMvpFragment {
     }
 
     @Override
+    public void onHiddenChanged(boolean hidden) {
+        super.onHiddenChanged(hidden);
+        if (hidden) {
+            //不能在此直接clearhistory,因为新的页面还没有加载完,无法清除history
+            mWebView.loadUrl(HttpClient.BASE_NET_URL + "weixinMinxin/allHanding_manage.php");
+            needClearHistory = true;
+        }
+    }
+
+
+    @Override
     protected void initViews() {
         //设置WebView属性,能够执行Javascript脚本
         mWebView.getSettings().setJavaScriptEnabled(true);
@@ -59,6 +84,7 @@ public class CaseFragment extends BaseMvpFragment {
         //当用户点击了你的WebView中的一个链接,默认的行为是Android启动一个处理URL的应用,通常,默认的浏览器打开并下载目标URL。
         // 可以在WebView中覆盖这一行为,使得连接仍在WebView中打开。
         mWebView.setWebViewClient(new WebViewClient() {
+
             @Override
             public void onPageFinished(WebView view, String url) {
                 super.onPageFinished(view, url);
@@ -66,9 +92,43 @@ public class CaseFragment extends BaseMvpFragment {
                 if (!TextUtils.isEmpty(title)) {
                     tvTitleCase.setText(title);
                 }
+                if (needClearHistory) {
+                    mWebView.clearHistory();
+                }
             }
         });
 
+        mWebView.setWebChromeClient(new WebChromeClient(){
+
+            // For Android < 3.0
+            public void openFileChooser(ValueCallback<Uri> valueCallback) {
+                uploadMessage = valueCallback;
+                openImageChooserActivity();
+            }
+
+            // For Android  >= 3.0
+            public void openFileChooser(ValueCallback valueCallback, String acceptType) {
+                uploadMessage = valueCallback;
+                openImageChooserActivity();
+            }
+
+            //For Android  >= 4.1
+            public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
+                uploadMessage = valueCallback;
+                openImageChooserActivity();
+            }
+
+
+            //For Android >=5.0
+            @Override
+            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
+               // return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
+                uploadMessageAboveL = filePathCallback;
+                openImageChooserActivity();
+                return true;
+
+            }
+        });
 
        /*
         mainWebView.canGoBack()
@@ -102,6 +162,56 @@ public class CaseFragment extends BaseMvpFragment {
         */
     }
 
+    private void openImageChooserActivity() {
+        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
+        i.addCategory(Intent.CATEGORY_OPENABLE);
+        i.setType("image/*");
+        startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE);
+
+    }
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == FILE_CHOOSER_RESULT_CODE) {
+            if (null == uploadMessage && null == uploadMessageAboveL) return;
+            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
+            if (uploadMessageAboveL != null) {
+                onActivityResultAboveL(requestCode, resultCode, data);
+            } else if (uploadMessage != null) {
+                uploadMessage.onReceiveValue(result);
+                uploadMessage = null;
+            }
+        }
+    }
+
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
+        if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null)
+            return;
+        Uri[] results = null;
+        if (resultCode == RESULT_OK) {
+            if (intent != null) {
+                String dataString = intent.getDataString();
+                ClipData clipData = intent.getClipData();
+                if (clipData != null) {
+                    results = new Uri[clipData.getItemCount()];
+                    for (int i = 0; i < clipData.getItemCount(); i++) {
+                        ClipData.Item item = clipData.getItemAt(i);
+                        results[i] = item.getUri();
+                    }
+                }
+                if (dataString != null)
+                    results = new Uri[]{Uri.parse(dataString)};
+            }
+        }
+        uploadMessageAboveL.onReceiveValue(results);
+        uploadMessageAboveL = null;
+    }
+
+
+
+
     @Override
     protected void initListeners() {
 

+ 110 - 0
app/src/main/java/com/wiipu/peopleheart/home/HomeNewFragment.java

@@ -1,12 +1,20 @@
 package com.wiipu.peopleheart.home;
 
+import android.annotation.TargetApi;
+import android.content.ClipData;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.support.v7.widget.GridLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 import android.widget.Button;
@@ -40,6 +48,8 @@ import butterknife.ButterKnife;
 import butterknife.OnClick;
 import butterknife.Unbinder;
 
+import static android.app.Activity.RESULT_OK;
+
 
 public class HomeNewFragment extends BaseMvpFragment{
 
@@ -51,6 +61,12 @@ public class HomeNewFragment extends BaseMvpFragment{
     @BindView(R.id.tv_title_home_net)
     TextView tvTitleHomeNet;
 
+    private ValueCallback<Uri> uploadMessage;
+    private ValueCallback<Uri[]> uploadMessageAboveL;
+    private final static int FILE_CHOOSER_RESULT_CODE = 10000;
+    private boolean needClearHistory = false;
+
+
     @Override
     protected void attach() {
 
@@ -62,6 +78,16 @@ public class HomeNewFragment extends BaseMvpFragment{
     }
 
     @Override
+    public void onHiddenChanged(boolean hidden) {
+        super.onHiddenChanged(hidden);
+        if (hidden) {
+            mWebView.loadUrl(HttpClient.BASE_NET_URL + "weixinMinxin/app_index.php");
+            needClearHistory = true;
+
+        }
+    }
+
+    @Override
     protected int getLayoutId() {
         return R.layout.fragment_home_net;
     }
@@ -85,12 +111,96 @@ public class HomeNewFragment extends BaseMvpFragment{
                 if (!TextUtils.isEmpty(title)) {
                    tvTitleHomeNet.setText(title);
                 }
+                if (needClearHistory) {
+                    mWebView.clearHistory();
+                }
             }
         });
 
+        mWebView.setWebChromeClient(new WebChromeClient(){
 
+            // For Android < 3.0
+            public void openFileChooser(ValueCallback<Uri> valueCallback) {
+                uploadMessage = valueCallback;
+                openImageChooserActivity();
+            }
+
+            // For Android  >= 3.0
+            public void openFileChooser(ValueCallback valueCallback, String acceptType) {
+                uploadMessage = valueCallback;
+                openImageChooserActivity();
+            }
+
+            //For Android  >= 4.1
+            public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
+                uploadMessage = valueCallback;
+                openImageChooserActivity();
+            }
+
+
+            //For Android >=5.0
+            @Override
+            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
+                // return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
+                uploadMessageAboveL = filePathCallback;
+                openImageChooserActivity();
+                return true;
+
+            }
+        });
+
+
+    }
+
+    private void openImageChooserActivity() {
+        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
+        i.addCategory(Intent.CATEGORY_OPENABLE);
+        i.setType("image/*");
+        startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE);
+
+    }
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == FILE_CHOOSER_RESULT_CODE) {
+            if (null == uploadMessage && null == uploadMessageAboveL) return;
+            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
+            if (uploadMessageAboveL != null) {
+                onActivityResultAboveL(requestCode, resultCode, data);
+            } else if (uploadMessage != null) {
+                uploadMessage.onReceiveValue(result);
+                uploadMessage = null;
+            }
+        }
     }
 
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
+        if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null)
+            return;
+        Uri[] results = null;
+        if (resultCode == RESULT_OK) {
+            if (intent != null) {
+                String dataString = intent.getDataString();
+                ClipData clipData = intent.getClipData();
+                if (clipData != null) {
+                    results = new Uri[clipData.getItemCount()];
+                    for (int i = 0; i < clipData.getItemCount(); i++) {
+                        ClipData.Item item = clipData.getItemAt(i);
+                        results[i] = item.getUri();
+                    }
+                }
+                if (dataString != null)
+                    results = new Uri[]{Uri.parse(dataString)};
+            }
+        }
+        uploadMessageAboveL.onReceiveValue(results);
+        uploadMessageAboveL = null;
+    }
+
+
+
     @Override
     protected void initListeners() {
 

+ 110 - 0
app/src/main/java/com/wiipu/peopleheart/info/InfoFragment.java

@@ -1,10 +1,18 @@
 package com.wiipu.peopleheart.info;
 
+import android.annotation.TargetApi;
+import android.content.ClipData;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 import android.widget.ImageView;
@@ -20,6 +28,8 @@ import butterknife.ButterKnife;
 import butterknife.OnClick;
 import butterknife.Unbinder;
 
+import static android.app.Activity.RESULT_OK;
+
 
 public class InfoFragment extends BaseMvpFragment {
 
@@ -34,6 +44,11 @@ public class InfoFragment extends BaseMvpFragment {
     @BindView(R.id.ll_info)
     RelativeLayout llInfo;
 
+    private ValueCallback<Uri> uploadMessage;
+    private ValueCallback<Uri[]> uploadMessageAboveL;
+    private final static int FILE_CHOOSER_RESULT_CODE = 10000;
+    private boolean needClearHistory = false;
+
     @Override
     protected void attach() {
 
@@ -50,6 +65,16 @@ public class InfoFragment extends BaseMvpFragment {
     }
 
     @Override
+    public void onHiddenChanged(boolean hidden) {
+        super.onHiddenChanged(hidden);
+        if (hidden) {
+            mWebView.loadUrl(HttpClient.BASE_NET_URL + "weixinMinxin/policyNews.php");
+            needClearHistory=true;
+        }
+    }
+
+
+    @Override
     protected void initViews() {
         //设置WebView属性,能够执行Javascript脚本
         mWebView.getSettings().setJavaScriptEnabled(true);
@@ -66,11 +91,96 @@ public class InfoFragment extends BaseMvpFragment {
                 if (!TextUtils.isEmpty(title)) {
                     tvTitleInfo.setText(title);
                 }
+                if (needClearHistory) {
+                    mWebView.clearHistory();
+                    needClearHistory = false;
+                }
+
+            }
+        });
+        mWebView.setWebChromeClient(new WebChromeClient(){
+
+            // For Android < 3.0
+            public void openFileChooser(ValueCallback<Uri> valueCallback) {
+                uploadMessage = valueCallback;
+                openImageChooserActivity();
+            }
+
+            // For Android  >= 3.0
+            public void openFileChooser(ValueCallback valueCallback, String acceptType) {
+                uploadMessage = valueCallback;
+                openImageChooserActivity();
+            }
+
+            //For Android  >= 4.1
+            public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
+                uploadMessage = valueCallback;
+                openImageChooserActivity();
+            }
+
+
+            //For Android >=5.0
+            @Override
+            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
+                // return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
+                uploadMessageAboveL = filePathCallback;
+                openImageChooserActivity();
+                return true;
+
             }
         });
 
+
+    }
+
+    private void openImageChooserActivity() {
+        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
+        i.addCategory(Intent.CATEGORY_OPENABLE);
+        i.setType("image/*");
+        startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE);
+
+    }
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == FILE_CHOOSER_RESULT_CODE) {
+            if (null == uploadMessage && null == uploadMessageAboveL) return;
+            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
+            if (uploadMessageAboveL != null) {
+                onActivityResultAboveL(requestCode, resultCode, data);
+            } else if (uploadMessage != null) {
+                uploadMessage.onReceiveValue(result);
+                uploadMessage = null;
+            }
+        }
+    }
+
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
+        if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null)
+            return;
+        Uri[] results = null;
+        if (resultCode == RESULT_OK) {
+            if (intent != null) {
+                String dataString = intent.getDataString();
+                ClipData clipData = intent.getClipData();
+                if (clipData != null) {
+                    results = new Uri[clipData.getItemCount()];
+                    for (int i = 0; i < clipData.getItemCount(); i++) {
+                        ClipData.Item item = clipData.getItemAt(i);
+                        results[i] = item.getUri();
+                    }
+                }
+                if (dataString != null)
+                    results = new Uri[]{Uri.parse(dataString)};
+            }
+        }
+        uploadMessageAboveL.onReceiveValue(results);
+        uploadMessageAboveL = null;
     }
 
+
     @Override
     protected void initListeners() {