软件编程
位置:首页>> 软件编程>> Android编程>> Android webview打开本地图片上传实现代码

Android webview打开本地图片上传实现代码

作者:ShouCeng  发布时间:2023-06-02 14:11:50 

标签:android,webview,上传

Webview打开本地图片选择器十分之麻烦,其在安卓系统3x 4x 5x上的行为都不同,处理也不同,所以之前差点崩溃。经过测试和完善,最终其在各个版本上都能完美工作。

直接上代码


package com.testandroid.webview;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebBackForwardList;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;

import com.testandroid.R;

public class WebViewActivity extends AppCompatActivity {

private final String TAG = WebViewActivity.class.getSimpleName();

private Button button;
 private WebView webView;

private String recgPic = "http://m.shitu.chinaso.com/mx/index.html";

public final static int FILECHOOSER_RESULTCODE = 1;
 public final static int FILECHOOSER_RESULTCODE_FOR_ANDROID_5 = 2;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_web_view);

button = (Button) findViewById(R.id.button);
   button.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
     }
   });

initTestWebView();

}

private void initTestWebView() {
   webView = (WebView) findViewById(R.id.tempWebView);

WiewSettings settings = webView.getSettings();
   settings.setJavaScriptEnabled(true);

webView.setWebChromeClient(new WebChromeClient() {
     @Override
     public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
       AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
       builder.setTitle("xxx提示").setMessage(message).setPositiveButton("确定", null);
       builder.setCancelable(false);
       builder.setIcon(R.mipmap.ic_launcher);
       AlertDialog dialog = builder.create();
       dialog.show();
       result.confirm();
       return true;
     }

//扩展浏览器上传文件
     //3.0++版本
     public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
       openFileChooserImpl(uploadMsg);
     }

//3.0--版本
     public void openFileChooser(ValueCallback<Uri> uploadMsg) {
       openFileChooserImpl(uploadMsg);
     }

public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
       openFileChooserImpl(uploadMsg);
     }

@Override
     public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
       onenFileChooseImpleForAndroid(filePathCallback);
       return true;
     }
   });

webView.setWebViewClient(new WebViewClient() {
     @Override
     public boolean shouldOverrideUrlLoading(WebView view, String url) {
       view.loadUrl(url);
       return true;
     }
   });
   webView.loadUrl(recgPic);

}

public ValueCallback<Uri> mUploadMessage;
 private void openFileChooserImpl(ValueCallback<Uri> uploadMsg) {
   mUploadMessage = uploadMsg;
   Intent i = new Intent(Intent.ACTION_GET_CONTENT);
   i.addCategory(Intent.CATEGORY_OPENABLE);
   i.setType("image/*");
   startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
 }

public ValueCallback<Uri[]> mUploadMessageForAndroid5;
 private void onenFileChooseImpleForAndroid(ValueCallback<Uri[]> filePathCallback) {
   mUploadMessageForAndroid5 = filePathCallback;
   Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
   contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
   contentSelectionIntent.setType("image/*");

Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
   chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
   chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");

startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE_FOR_ANDROID_5);
 }

@Override
 protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
   if (requestCode == FILECHOOSER_RESULTCODE) {
     if (null == mUploadMessage)
       return;
     Uri result = intent == null || resultCode != RESULT_OK ? null: intent.getData();
     mUploadMessage.onReceiveValue(result);
     mUploadMessage = null;

} else if (requestCode == FILECHOOSER_RESULTCODE_FOR_ANDROID_5){
     if (null == mUploadMessageForAndroid5)
       return;
     Uri result = (intent == null || resultCode != RESULT_OK) ? null: intent.getData();
     if (result != null) {
       mUploadMessageForAndroid5.onReceiveValue(new Uri[]{result});
     } else {
       mUploadMessageForAndroid5.onReceiveValue(new Uri[]{});
     }
     mUploadMessageForAndroid5 = null;
   }
 }

@Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
     //获取历史列表
     WebBackForwardList mWebBackForwardList = webView
         .copyBackForwardList();
     //判断当前历史列表是否最顶端,其实canGoBack已经判断过
     if (mWebBackForwardList.getCurrentIndex() > 0) {
       webView.goBack();
       return true;
     }
   }
   return super.onKeyDown(keyCode, event);
 }
}
0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com