webView选择本地图片

场景描述:
   在WebView加载的界面,实现及时通讯功能。界面下方,有选择图片按钮,点击之后,进入系统图库,
选择好图片后,webView将此图片发送出去,及时通讯的对方,接受到此图片。

解决方案:(此处,忽略webView的漏洞问题,直接进行常规场景的考虑)


1、注册javascript方法,对点击按钮进行响应;
2、响应后,跳转到系统图库选择界面,进行图片选择;
3、选择完图片后,获取对应bitmap,并对它进行压缩;
4、将压缩的bitmap进行以字节流的形式,读入内存;
5、对bitmap的字节数组进行64位编码;

6、将编码后的字符串生成javascript格式的字符串,让webView进行加载,加载成功即上传图片完成。


一、注册javascript方法,对点击按钮进行响应:


	@Javascript
        public void chooseImage(String successName) {
            pickImage();
        }

二、响应后,跳转到系统图库选择界面,进行图片选择:


   /**
     * 打开图库,调用选择图片
     */
    public void pickImage(){
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        this.startActivityForResult(intent, REQUEST_PHOTO_STORE);
    }

三、选择完图片后,获取对应bitmap,并对它进行压缩;
四、将压缩的bitmap进行以字节流的形式,读入内存;
五、对bitmap的字节数组进行64位编码;
六、将编码后的字符串生成javascript格式的字符串,让webView进行加载,加载成功即上传图片完成。

        @Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
			if(RESULT_OK == resultCode){
				if (requestCode == REQUEST_PHOTO_STORE) {
					// 从图库回来;
					if (null != data && null != data.getData()) {
						Uri uri = data.getData();
						try {
							Bitmap photoBmp = null;
							photoBmp = Utils.getBitpMap(this,uri);
							//初始化一个流对象
							ByteArrayOutputStream bos = new ByteArrayOutputStream();
							//把bitmap100%高质量压缩 到 output对象里
							photoBmp.compress(Bitmap.CompressFormat.PNG,100,bos);
							//转换成功了
							byte[] image = bos.toByteArray();
							//生成webView加载的js字符串
							String jsMethod = javascript.getSuccessMethod(image,"png");
							webview.loadUrl(jsMethod);
						}catch(Exception e){
							e.printStackTrace();
						}
					}
				}
			}
	}
	
	/**
	*根据资源uri获取对应的bitmap,并进行压缩处理
	*/
	public static Bitmap getBitpMap(Context context, Uri uri) {
		ParcelFileDescriptor pfd;
		try {
			pfd = context.getContentResolver().openFileDescriptor(uri, "r");

		} catch (IOException ex) {
			return null;
		}
		java.io.FileDescriptor fd = pfd.getFileDescriptor();
		BitmapFactory.Options options = new BitmapFactory.Options();
		// 先指定原始大小
		options.inSampleSize = 1;
		// 只进行大小判断
		options.inJustDecodeBounds = true;
		// 调用此方法得到options得到图片的大小
		BitmapFactory.decodeFileDescriptor(fd, null, options);
		// 我们的目标是在800pixel的画面上显示。
		// 所以需要调用computeSampleSize得到图片缩放的比例
		options.inSampleSize = calculateInSampleSize(options, 480,800);
		// OK,我们得到了缩放的比例,现在开始正式读入BitMap数据
		options.inJustDecodeBounds = false;
		options.inDither = false;
		options.inPreferredConfig = Bitmap.Config.ARGB_8888;
		// 根据options参数,减少所需要的内存
		Bitmap sourceBitmap = BitmapFactory.decodeFileDescriptor(fd, null,
				options);
		return sourceBitmap;
	}
	
	
	//图片选择成功后调用此方法
	public String getSuccessMethod(byte[] content,String suffix){
			String resultBase64 = "data:image/" + suffix + ";base64," + Base64.encodeToString(content, Base64.DEFAULT);
			String jsMethod = "javascript:" + successName + "('" + resultBase64 + "')";
			//生成js调用方法后,使用webview.load(jsMethod);
			return jsMethod;
	}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值