在Android浏览器中通过WebView调用相机拍照/选择文件 上传到服务器 – CSDN博客

来源: 在Android浏览器中通过WebView调用相机拍照/选择文件 上传到服务器 – CSDN博客

最近做的一个项目中,有这样一个要求,在浏览器中调用系统的拍照功能或者选择文件,然后将文件上传到服务器,类似修改头像。        简单而言,就是在一个html页面中有这样一段代码 <input class=”filePrew” type=”file” capture=”camera” accept=”image/*” name=”image”>

刚开始的时候,没有感觉很难的,因为在UC浏览器、系统自带的浏览器中都可以进行拍照/文件管理器选择,可是在自己所写的Activity中却不行。后来实在是没有思路了,就在网上找了一下,发现要        实现这种功能,都是在webview的WebChromeClient中覆盖掉openFileChooser方法,注意openFileChooser方法在WebChromeClient中有@hide标记。这里只管重写即可,下面将主要代码贴出来,做个记录

private ValueCallback<Uri> mUploadFile;  
    /**拍照/选择文件请求码*/  
    private static final int REQUEST_UPLOAD_FILE_CODE = 12343;  
    private void setWebChromeClient()  
    {  
        if (null != mMainWebView)  
        {  
            mMainWebView.setWebChromeClient(new WebChromeClient()  
            {  
                // Andorid 4.1+  
                public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)  
                {  
                    openFileChooser(uploadFile);  
                }  
  
                // Andorid 3.0 +  
                public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType)  
                {  
                    openFileChooser(uploadFile);  
                }  
  
                // Android 3.0  
                public void openFileChooser(ValueCallback<Uri> uploadFile)  
                {  
                    // Toast.makeText(WebviewActivity.this, "上传文件/图片",Toast.LENGTH_SHORT).show();  
                    mUploadFile = uploadFile;  
                    startActivityForResult(Intent.createChooser(createCameraIntent(), "Image Browser"), REQUEST_UPLOAD_FILE_CODE);  
                }  
            });  
        }  
    }  
  
    private Intent createCameraIntent()  
    {  
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//拍照  
        //=======================================================  
        Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);//选择图片文件  
        imageIntent.setType("image/*");  
        //=======================================================  
        return cameraIntent;  
    }  
    //最后在OnActivityResult中接受返回的结果  
    protected void onActivityResult(int requestCode, int resultCode, Intent data)  
    {  
        if (requestCode == REQUEST_UPLOAD_FILE_CODE && resultCode == RESULT_OK)  
        {  
            if (null == mUploadFile)  
            {  
                return;  
            }  
            Uri result = (null == data) ? null : data.getData();  
            if (null != result)  
            {  
                ContentResolver resolver = this.getContentResolver();  
                String[] columns = { MediaStore.Images.Media.DATA };  
                Cursor cursor = resolver.query(result, columns, null, null, null);  
                cursor.moveToFirst();  
                int columnIndex = cursor.getColumnIndex(columns[0]);  
                String imgPath = cursor.getString(columnIndex);  
                System.out.println("imgPath = " + imgPath);  
                if (null == imgPath)  
                {  
                    return;  
                }  
                File file = new File(imgPath);  
                   //将图片处理成大小符合要求的文件  
                result = Uri.fromFile(handleFile(file));  
                mUploadFile.onReceiveValue(result);  
                mUploadFile = null;       
            }  
        }  
        super.onActivityResult(requestCode, resultCode, data);  
    }  
    /**处理拍照/选择的文件*/  
    private File handleFile(File file)  
    {  
        DisplayMetrics dMetrics = getResources().getDisplayMetrics();  
        BitmapFactory.Options options = new Options();  
        options.inJustDecodeBounds = true;  
         BitmapFactory.decodeFile(file.getAbsolutePath(), options);  
        int imageWidth = options.outWidth;  
        int imageHeight = options.outHeight;  
        System.out.println("  imageWidth = " + imageWidth + " imageHeight = " + imageHeight);  
        int widthSample = (int) (imageWidth / (dMetrics.density * 90));  
        int heightSample = (int) (imageHeight / (dMetrics.density * 90));  
        System.out.println("widthSample = " + widthSample + " heightSample = " + heightSample);  
        options.inSampleSize = widthSample < heightSample ? heightSample : widthSample;  
        options.inJustDecodeBounds = false;  
        Bitmap newBitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);  
        System.out.println("newBitmap.size = " + newBitmap.getRowBytes() * newBitmap.getHeight());  
        File handleFile = new File(file.getParentFile(), "upload.png");  
        try  
        {  
            if (newBitmap.compress(CompressFormat.PNG, 50, new FileOutputStream(handleFile)))  
            {  
                System.out.println("保存图片成功");  
            }  
        }  
        catch (FileNotFoundException e)  
        {  
            e.printStackTrace();  
        }  
  
        return handleFile;  
  
    }  

这样就可以在WebView中上传文件了。记得要添加相应的权限!
参考:http://developer.Android.com/about/versions/Android-3.0.html

http://blog.sina.com.cn/s/blog_5749ead90101clrn.html

分享到: 更多 (0)