小白一记,给自己备用 也给其它小白一个完整的通过webview上传的代码思路。
首先是权限要加上:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 调用摄像头的权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<!-- 文件系统权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- SD卡写权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
声明变量
private ValueCallback<Uri> mUploadMessage;
private File cameraDataDir;
private File externalDataDir;
private String mCameraFilePath;
设置代理,覆写openFileChooser方法
webView.setWebChromeClient(new WebChromeClient() {
// For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType,String capture){
mUploadMessage = uploadMsg;
WebViewActivity.this.startActivityForResult(createDefaultOpenableIntent(), Constants.FILECHOOSER_RESULTCODE);
}
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType){
mUploadMessage = uploadMsg;
WebViewActivity.this.startActivityForResult(createDefaultOpenableIntent(), Constants.FILECHOOSER_RESULTCODE);
}
// For Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
WebViewActivity.this.startActivityForResult(Intent.createChooser(intent, "upload ok"), Constants.FILECHOOSER_RESULTCODE);
}
});
/*
***自定义哪些选择器可以被自带浏览器打开***
*R:打开相应文件的选择器
*Author: Belinda Yang Time: Dec.31 2014 14:40
*/
private Intent createDefaultOpenableIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Intent chooser = createChooserIntent(createCameraIntent(), new Intent(MediaStore.ACTION_VIDEO_CAPTURE));
chooser.putExtra(Intent.EXTRA_INTENT, intent);
return chooser;
}
private Intent createChooserIntent(Intent... intents) {
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);
chooser.putExtra(Intent.EXTRA_TITLE, "File Chooser");
return chooser;
}
private Intent createCameraIntent() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
externalDataDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
cameraDataDir = new File(externalDataDir.getAbsolutePath() + File.separator + "browser-photos");
cameraDataDir.mkdirs();
mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator +System.currentTimeMillis() + ".jpg";
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath)));
return cameraIntent;
}
结果值处理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == Constants.FILECHOOSER_RESULTCODE) {
if (null == mUploadMessage)
return;
Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
// System.out.println("BY~~~ result= "+result);
if (result == null && intent == null && resultCode == Activity.RESULT_OK) {
File cameraFile = new File(mCameraFilePath );
if (cameraFile.exists()) {
result = Uri.fromFile(cameraFile);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, result));
}
}
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}