您的位置:首页 > 移动开发

WebView中调用系统相册或拍照上传

2016-06-30 17:33 183 查看
     今天项目接入了别的项目中的H5页面,接完后发现上传图片的时候点击没反应,后来才知道android中WebView上传图片还得自己实现。实现方法记录一下:

public class OADetailActivity extends BaseActivity {
private WebView wv_project_brief;
private ProgressBar progressBar;
private int screenWidth;
private ImageView iv_finish;
private ValueCallback<Uri> mUploadFile;
private ValueCallback<Uri[]> mUploadCallbackAboveL;
private LinearLayout ll_main;
/**拍照/选择文件请求码*/
private final int REQUESTCODE_TAKE = 1;
private final int REQUESTCODE_PICK = 2;
private final int REQUESTCODE_CUTTING = 3;
private String headPath = "";
private Uri uritempFile;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_oa_detail);
DisplayMetrics dm = new DisplayMetrics();
getWindow().getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
initView();
initData();
}

private void initView() {
TextView tv_topview_title = (TextView) findViewById(R.id.tv_topview_title);
iv_finish = (ImageView) findViewById(R.id.iv_finish);
ll_main = (LinearLayout) findViewById(R.id.ll_main);
tv_topview_title.setText(getString(R.string.oa_system));
wv_project_brief = (WebView) findViewById(R.id.wv_project_brief);
progressBar = (ProgressBar) findViewById(R.id.progressBar);

wv_project_brief.getSettings().setJavaScriptEnabled(true);
wv_project_brief.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
wv_project_brief.getSettings().setAllowFileAccess(true);
wv_project_brief.getSettings().setDefaultTextEncodingName("UTF-8");
wv_project_brief.getSettings().setLoadWithOverviewMode(true);
wv_project_brief.getSettings().setUseWideViewPort(true);
iv_finish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}

private void initData() {
String url = getIntent().getStringExtra("url");
wv_project_brief.loadUrl(url);
wv_project_brief.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}

@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
progressBar.setVisibility(View.GONE);
}
});
wv_project_brief.setWebChromeClient(new WebChromeClient()
{ //5.0以上调用此处
@Override
@SuppressLint("NewApi")
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
if (mUploadCallbackAboveL != null) {
mUploadCallbackAboveL.onReceiveValue(null);
}
mUploadCallbackAboveL = filePathCallback;
new PopupWindows(OADetailActivity.this, ll_main);
return true;
}
// Andorid 4.1+
public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)
{
openFileChooser(uploadFile,acceptType);
}

// Andorid 3.0 +
public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType)
{
mUploadFile = uploadFile;
new PopupWindows(OADetailActivity.this, ll_main);
// openFileChooser(uploadFile);
}

// Android 3.0
public void openFileChooser(ValueCallback<Uri> uploadFile)
{
// Toast.makeText(WebviewActivity.this, "上传文件/图片",Toast.LENGTH_SHORT).show();
openFileChooser(uploadFile,"");
}
});
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && wv_project_brief.canGoBack()) {
wv_project_brief.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
public class PopupWindows extends PopupWindow {

public PopupWindows(Context mContext, View parent) {
View view = View.inflate(mContext, R.layout.add_photo_pupwindow, null);
view.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.fade_ins));

setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
setHeight(ViewGroup.LayoutParams.MATCH_PARENT);
setFocusable(true);
setOutsideTouchable(true);
setContentView(view);
showAtLocation(parent, Gravity.BOTTOM, 0, 0);
update();

TextView tv_take_photo = (TextView) view.findViewById(R.id.tv_take_photo);
TextView tv_pick_photo = (TextView) view.findViewById(R.id.tv_pick_photo);
TextView tv_cancel = (TextView) view.findViewById(R.id.tv_cancel);
tv_take_photo.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
takePhoto();
dismiss();
}
});
tv_pick_photo.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
doPickPhotoFromGallery();
dismiss();
}
});
tv_cancel.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dismiss();
}
});

}
}
public void takePhoto() {
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

File vFile = new File(Environment.getExternalStorageDirectory()
+ "/bxt_image/", String.valueOf(System.currentTimeMillis())
+ ".jpg");
if (!vFile.exists()) {
File vDirPath = vFile.getParentFile();
vDirPath.mkdirs();
} else {
if (vFile.exists()) {
vFile.delete();
}
}
headPath = vFile.getPath();
Uri cameraUri = Uri.fromFile(vFile);
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
startActivityForResult(openCameraIntent, REQUESTCODE_TAKE);
}

protected void doPickPhotoFromGallery() {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, REQUESTCODE_PICK);
}

/**
* 裁剪图片方法实现
*
* @param uri
*/
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
// intent.putExtra("return-data", true);
uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(intent, REQUESTCODE_CUTTING);
}

String urlpath;//裁剪后的图片路径

/**
* 保存裁剪之后的图片数据
*
* @param picdata
*/
private void setPicToView(Intent picdata) {
// Bundle extras = picdata.getExtras();
// if (extras != null) {
// 取得SDCard图片路径做显示
// Bitmap photo = extras.getParcelable("data");
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uritempFile));
urlpath = FileUtil.saveFile(this, System.currentTimeMillis()+".jpg", bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
postFile(urlpath);
} catch (Exception e) {
e.printStackTrace();
}
// }
}

public void postFile(String path) throws Exception {
File file = new File(path);
if (file.exists() && file.length() > 0) {
Uri uri = Uri.fromFile(file);
if(mUploadFile!=null){
mUploadFile.onReceiveValue(uri);
mUploadFile = null;
}
if(mUploadCallbackAboveL!=null){
mUploadCallbackAboveL.onReceiveValue(new Uri[]{uri});
mUploadCallbackAboveL = null;
}
} else {
LogUtils.i(TAG, "no file");
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUESTCODE_TAKE:// 调用相机拍照
if (resultCode == RESULT_OK) {
File temp = new File(headPath);
startPhotoZoom(Uri.fromFile(temp));
}
break;
case REQUESTCODE_PICK:// 直接从相册获取
try {
startPhotoZoom(data.getData());
} catch (NullPointerException e) {
e.printStackTrace();// 用户点击取消操作
}
break;
case REQUESTCODE_CUTTING:// 取得裁剪后的图片
if (data != null) {
setPicToView(data);
}
break;
}
if(resultCode==0){
if(mUploadFile!=null){
mUploadFile.onReceiveValue(null);
}
if(mUploadCallbackAboveL!=null){
mUploadCallbackAboveL.onReceiveValue(null);
}
}
super.onActivityResult(requestCode, resultCode, data);
}

@Override
public void onResume() {
super.onResume();
try {
wv_project_brief.getClass().getMethod("onResume").invoke(wv_project_brief, (Object[])null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}

@Override
public void onPause() {
super.onPause();
try {
wv_project_brief.getClass().getMethod("onPause").invoke(wv_project_brief, (Object[])null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
public class FileUtil {
/**
* 将Bitmap 图片保存到本地路径,并返回路径
*
* @param c
* @param mType    资源类型,参照  MultimediaContentType 枚举,根据此类型,保存时可自动归类
* @param fileName 文件名称
* @param bitmap   图片
* @return
*/
public static String saveFile(Context c, String fileName, Bitmap bitmap) {
return saveFile(c, "", fileName, bitmap);
}

public static String saveFile(Context c, String filePath, String fileName, Bitmap bitmap) {
byte[] bytes = bitmapToBytes(bitmap);
return saveFile(c, filePath, fileName, bytes);
}

public static byte[] bitmapToBytes(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(CompressFormat.JPEG, 100, baos);
return baos.toByteArray();
}

public static String saveFile(Context c, String filePath, String fileName, byte[] bytes) {
String fileFullName = "";
FileOutputStream fos = null;
String dateFolder = new SimpleDateFormat("yyyyMMdd", Locale.CHINA)
.format(new Date());
try {
String suffix = "";
if (filePath == null || filePath.trim().length() == 0) {
filePath = Environment.getExternalStorageDirectory() + "/BXT_SetPic/" + dateFolder + "/";
}
File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
File fullFile = new File(filePath, fileName + suffix);
fileFullName = fullFile.getPath();
fos = new FileOutputStream(new File(filePath, fileName + suffix));
fos.write(bytes);
} catch (Exception e) {
fileFullName = "";
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
fileFullName = "";
}
}
}
return fileFullName;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android