Android学习之实现WebView中input="file"选择文件,处理选择图片无法返回类型问题

本文介绍了一个自定义WebChromeClient类来处理不同Android版本中通过<input type=file>选择文件进行上传的问题。文章详细展示了如何根据不同Android版本调用相应的方法,并通过Intent启动文件选择器,最后解析返回的Uri获取文件的真实路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// js上传文件的<input type="file" name="fileField" id="fileField" />事件捕获    

private ValueCallback<Uri> mUploadMessage;
private final int FILECHOOSER_RESULTCODE = 1;

// 需要自己重写WebChromeClient类,并实现里面的三个方法。如下:

private class MyWebChromeClient extends WebChromeClient{

    // Android < 3.0 调用这个方法 
    public void openFileChooser(ValueCallback<Uri> uploadMsg) {
        this.openFileChooser(uploadMsg, "*/*");
    }
    
    // 3.0 + 调用这个方法 
    public void openFileChooser( ValueCallback<Uri> uploadMsg, String acceptType ) {
        this.openFileChooser(uploadMsg, acceptType, null);
    }
    
    // Android > 4.1.1 调用这个方法 
    public void openFileChooser(final ValueCallback<Uri> uploadMsg, String acceptType, String capture)
    {
        mUploadMessage = uploadMsg; // 使用uploadMsg返回获取到的文件路径
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        startActivityForResult(intent, FILECHOOSER_RESULTCODE);
    }
}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
	    if (requestCode == FILECHOOSER_RESULTCODE) { 
	        if (mUploadMessage == null) 
	            return; 
	        Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData(); 
	        try {
			mUploadMessage.onReceiveValue(Uri.fromFile(new File(getRealFilePath(context, result))));
		} catch (Exception e) {
			mUploadMessage = null; 
			e.printStackTrace();
		} 
	        mUploadMessage = null; 
	    }
	}

    /**
     * 根据uri获取图片的真真实路径
     * @param context
     * @param uri
     * @return
     */
    private String getRealFilePath(Context context, Uri uri ) {
        if ( null == uri ) return null;
        final String scheme = uri.getScheme();
        String data = null;
        if ( scheme == null )
            data = uri.getPath();
        else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
            data = uri.getPath();
        } else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
            Cursor cursor = context.getContentResolver().query( uri, new String[] { ImageColumns.DATA }, null, null, null );
            if ( null != cursor ) {
                if ( cursor.moveToFirst() ) {
                    int index = cursor.getColumnIndex( ImageColumns.DATA );
                    if ( index > -1 ) {
                        data = cursor.getString( index );
                    }
                }
                cursor.close();
            }
        }
        return data;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值