安卓webview上传照片的实现,2017最新总结

其实webview网上很多,参差不齐,但是能用的实用的少之又少,曾经做这个webview耗费大量时间,网上的大部分都有缺陷,要么启动intent界面不好看,要么只能打开一次第二次就点不动打开页面了,要么打开图片上传失败后就再也打开不了。经过了种种挫折和测试,自己终于找到了一套属于自己的可以上传照片的webview,下面是代码

package com.example.znxc;


import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.example.util.WebHost;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ComponentName;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.telephony.TelephonyManager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient.FileChooserParams;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;


public class MainActivity extends Activity {
	public static String imei ="";
	//设置静态方法实现类,监听回退
	public static MainActivity instance = null;
	private WebView wv1;
	public static final String TAG = "MainActivity";
	private WebView mWebView;
	private ValueCallback<Uri> mUploadMessage;// 表单的数据信息
	private ValueCallback<Uri[]> mUploadCallbackAboveL;
	private final static int FILECHOOSER_RESULTCODE = 1;// 表单的结果回调</span>
	private Uri imageUri;
	private long mExitTime;
	//webview定义的参数
	public static int Circle = 0x01;
	public static int Horizontal = 0x02;
	public static String results = "";

	
	private ProgressBar progressBar = null;  //水平进度条
	private RelativeLayout progressBar_circle = null;  //包含圆形进度条的布局
	private int barHeight = 8;  //水平进度条的高
	private boolean isAdd = false;  //判断是否已经加入进度条
	private int progressStyle = Horizontal;  //进度条样式,Circle表示为圆形,Horizontal表示为水平
	private View mErrorView;  
@Override
protected void onCreate(Bundle savedInstanceState) {
	// TODO Auto-generated method stub
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
			wv1 = (WebView)findViewById(R.id.mainweb);
			wv1.getSettings().setJavaScriptEnabled(true);
			wv1.getSettings().setBuiltInZoomControls(true);
			wv1.getSettings().setSupportZoom(true); 
			wv1.getSettings().setAllowFileAccess(true);// 设置允许访问文件数据
			wv1.setClickable(true);
			wv1.getSettings().setGeolocationEnabled(true);  
			wv1.getSettings().setGeolocationDatabasePath(MainActivity.this.getFilesDir().getPath());
			wv1.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
			wv1.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
//			wv1.onProgressChanged(0x01);
			wv1.getSettings().setDomStorageEnabled(true);  
			wv1.setEnabled(true);
			wv1.getSettings().setUseWideViewPort(true);
			wv1.getSettings().setLoadWithOverviewMode(true);
			wv1.loadData("","text/html","UTF-8");
			wv1.clearCache(true);
			
			
			//设置在webview点开一个a标签时在不会调用系统的浏览器
			wv1.setWebViewClient(new WebViewClient(){
				
				 @Override
		            public boolean shouldOverrideUrlLoading(WebView view, String url) {
					 view.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);  
		                view.loadUrl(url);
		                return super.shouldOverrideUrlLoading(view, url);
		            }
		    	@Override
		    	public void onPageStarted(WebView view, String url, Bitmap favicon) {
		    		// TODO Auto-generated method stub
		    		super.onPageStarted(view, url, favicon);
		    	}
		    	@Override
		    	public void onPageFinished(WebView view, String url) {
		    		// TODO Auto-generated method stub
		    		super.onPageFinished(view, url);
		    	}
	           
	        });
			wv1.setWebChromeClient(new WebChromeClient(){
				
//				public void onPageFinished(WebView view, String url) {//处理网页加载成功时
//					wv1.setVisibility(View.GONE);
//				}
				
				@Override
				public boolean onShowFileChooser(WebView webView,
						ValueCallback<Uri[]> filePathCallback,
						FileChooserParams fileChooserParams) {
					mUploadCallbackAboveL=filePathCallback;
					take();
					return true;
					
				}
				public void openFileChooser(ValueCallback<Uri> uploadMsg) {
					mUploadMessage=uploadMsg;
					take();
				}
				public void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType) {
					mUploadMessage=uploadMsg;
					take();
				}
				public void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType, String capture) {
					mUploadMessage=uploadMsg;
					take();
					}
				  @Override
			        public void onGeolocationPermissionsShowPrompt(String origin,
			                android.webkit.GeolocationPermissions.Callback callback) {
			            super.onGeolocationPermissionsShowPrompt(origin, callback);
			            callback.invoke(origin, true, false);
			        }
				  
				  
			});
			wv1.loadUrl("http://192.168.1.109:8060/pm/znxc/app/jsp/index.jsp");
		}
		
		  public boolean onCreateOptionsMenu(Menu menu) {
				// Inflate the menu; this adds items to the action bar if it is present.
		    	MainActivity.instance.getMenuInflater().inflate(R.menu.main, menu);
				return true;
			}
		
		@Override
	  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	      super.onActivityResult(requestCode, resultCode, data);
	  
	      if(requestCode==FILECHOOSER_RESULTCODE)
	      {
	          if (null == mUploadMessage && null == mUploadCallbackAboveL){
	          	return;
	          } 
	          Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
//	          if (data == null){
//	        	  mUploadMessage = null; 
//	        	  return ;
//	          }
	          if (null != mUploadCallbackAboveL) {
	        	 
	              onActivityResultAboveL(requestCode, resultCode, data);
	          }
	          else  if (mUploadMessage != null) {

					if (result != null) {
						String path = getPath(getApplicationContext(),
								result);
						Uri uri = Uri.fromFile(new File(path));
						mUploadMessage
								.onReceiveValue(uri);
					} else {
						mUploadMessage.onReceiveValue(imageUri);
					}
					mUploadMessage = null;
	          }
	      }
	  }
		@SuppressWarnings("null")
		@TargetApi(Build.VERSION_CODES.LOLLIPOP)
	  private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {
	      if (requestCode != FILECHOOSER_RESULTCODE
	              || mUploadCallbackAboveL == null) {
	          return;
	      }
	      
	      Uri[] results = null;

	      if (resultCode == Activity.RESULT_OK) {

	          if (data == null) {
	          	results = new Uri[]{imageUri};
	          } else {
	              String dataString = data.getDataString();
	              ClipData clipData = data.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)};
	          }
	      }
	      if(results!=null){
	      	   mUploadCallbackAboveL.onReceiveValue(results);
	 	        mUploadCallbackAboveL = null;
	      }else{
//	      	results = new Uri[]{imageUri};
	      	mUploadCallbackAboveL.onReceiveValue(null);
	 	        mUploadCallbackAboveL = null;
	 	     
	      }
	   
	      return;
	  }
		private void take(){
	      File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");
	      // Create the storage directory if it does not exist
	      if (! imageStorageDir.exists()){
	          imageStorageDir.mkdirs();                  
	      }
	      File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");  
	      imageUri = Uri.fromFile(file); 

	      final List<Intent> cameraIntents = new ArrayList<Intent>();
	      final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
	      final PackageManager packageManager = getPackageManager();
	      final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
	      for(ResolveInfo res : listCam) {
	          final String packageName = res.activityInfo.packageName;
	          final Intent i = new Intent(captureIntent);
	          i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
	          i.setPackage(packageName);
	          i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
	          cameraIntents.add(i);

	      }
	      Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
	      i.addCategory(Intent.CATEGORY_OPENABLE);  
	      i.setType("image/*"); 
	      Intent chooserIntent = Intent.createChooser(i,"Image Chooser");
	      chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
//	      this.startActivityForResult(chooserIntent,  FILECHOOSER_RESULTCODE);
	      try {  
	          this.startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);  
	      } catch (ActivityNotFoundException e) {  
	    	  mUploadMessage = null;  
	          return ;  
	      }  

	  }

	@TargetApi(Build.VERSION_CODES.KITKAT)
	public static String getPath(final Context context, final Uri uri) {
		final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

		// DocumentProvider
		if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
			// ExternalStorageProvider
			if (isExternalStorageDocument(uri)) {
				final String docId = DocumentsContract.getDocumentId(uri);
				final String[] split = docId.split(":");
				final String type = split[0];

				if ("primary".equalsIgnoreCase(type)) {
					return Environment.getExternalStorageDirectory() + "/" + split[1];
				}			
			}
			// DownloadsProvider
			else if (isDownloadsDocument(uri)) {

				final String id = DocumentsContract.getDocumentId(uri);
				final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

				return getDataColumn(context, contentUri, null, null);
			}
			// MediaProvider
			else if (isMediaDocument(uri)) {
				final String docId = DocumentsContract.getDocumentId(uri);
				final String[] split = docId.split(":");
				final String type = split[0];

				Uri contentUri = null;
				if ("image".equals(type)) {
					contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
				} else if ("video".equals(type)) {
					contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
				} else if ("audio".equals(type)) {
					contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
				}

				final String selection = "_id=?";
				final String[] selectionArgs = new String[]{split[1]};

				return getDataColumn(context, contentUri, selection, selectionArgs);
			}
		}
		// MediaStore (and general)
		else if ("content".equalsIgnoreCase(uri.getScheme())) {
			return getDataColumn(context, uri, null, null);
		}
		// File
		else if ("file".equalsIgnoreCase(uri.getScheme())) {
			return uri.getPath();
		}

		return null;
	}


	/**
	* Get the value of the data column for this Uri. This is useful for
	* MediaStore Uris, and other file-based ContentProviders.
	*
	* @param context       The context.
	* @param uri           The Uri to query.
	* @param selection     (Optional) Filter used in the query.
	* @param selectionArgs (Optional) Selection arguments used in the query.
	* @return The value of the _data column, which is typically a file path.
	*/
	public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
		Cursor cursor = null;
		final String column = "_data";
		final String[] projection = {column};

		try {
			cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
			if (cursor != null && cursor.moveToFirst()) {
				final int column_index = cursor.getColumnIndexOrThrow(column);
				return cursor.getString(column_index);
			}
		} finally {
			if (cursor != null) cursor.close();
		}
		return null;
	}


	/**
	* @param uri The Uri to check.
	* @return Whether the Uri authority is ExternalStorageProvider.
	*/
	public static boolean isExternalStorageDocument(Uri uri) {
		return "com.android.externalstorage.documents".equals(uri.getAuthority());
	}


	/**
	* @param uri The Uri to check.
	* @return Whether the Uri authority is DownloadsProvider.
	*/
	public static boolean isDownloadsDocument(Uri uri) {
		return "com.android.providers.downloads.documents".equals(uri.getAuthority());
	}


	/**
	* @param uri The Uri to check.
	* @return Whether the Uri authority is MediaProvider.
	*/
	public static boolean isMediaDocument(Uri uri) {
		return "com.android.providers.media.documents".equals(uri.getAuthority());
	}

		
		private class HelloWebViewClient extends WebViewClient {  
	      @Override 
	      public boolean shouldOverrideUrlLoading(WebView view, String url) {  
	          view.loadUrl(url);  
	          return true;  
	      }
	  }
		private class MyWebChromeClient extends WebChromeClient {
			@Override
			public boolean onJsAlert(WebView view, String url, String message,
					JsResult result) {
				// TODO 自动生成的方法存根
				return super.onJsAlert(view, url, message, result);
			}
		}
		public void setProgressStyle(int style){
			progressStyle = style;
		}


		@Override  
		public void onDestroy() {  
			wv1.removeAllViews();
			wv1.clearHistory();
		   wv1.stopLoading();  
		   wv1.destroy();  
		   wv1 = null;  
		   super.onDestroy(); 
		 }
}

以上是webview代码,一个完整的webview,是要有几个功能补全的(比如加载webview前的空白界面,加载webview如果失败出现的失败页面),这些都需要webview里面写全代码,上述代码只是解决webview上传照片的功能,后面还会加入上述的的功能,敬请期待,有交流和需要帮助的朋友可以留言


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值