前言:这段时间也真是忙到死,本来一个月四篇的承诺,眼看就要打破了,咬着牙再出两篇,最近写工程时,遇到拍照和裁剪功能,也真是服了,各种问题有木有,最后终于找着了一个解决方案,就目前来讲,应用在工程中,还没有什么问题。如果大家有碰到问题,欢迎留言交流

相关博客:

《拍照、相册及裁剪的终极实现(一)——拍照及裁剪功能实现》
《 拍照、相册及裁剪的终极实现(二)——相册选择及裁剪功能实现》

看来很容易的问题,解决起来却也处处是坑,各种问题啊有木有,要吐血了啊有木有,到网上一搜一堆帖子,能用的基本上没有啊有木有,真是服了……

这里有几篇写的比较好的文章,虽然不是终极方案,但也能我起到了启蒙作用,链接如下:

1、《 如何使用Android MediaStore裁剪大图片》

2、《Android大图片裁剪终极解决方案(上:原理分析)》 及其他文章底部链接中的上、中、下三篇

3、《Android 大图片裁切时遇到的问题》  这篇文章写的极好,分析问题非常出众

4、《Android大图片裁剪终极解决方案 原理分析》这个大哥分析的也极好,不过他的终极解决方案在一些手机上行不通

一、基础讲解

一般而言,使用拍照和裁剪功能基本上都是使用系统自带的Intent来实现,看起来直接调别人的写好的东东会比较容易,但真正用起来确发现根本不是那回事,找不到源码是个最大的问题,话说我至今都没找到源码的位置,有哪位同学知道源码位置的留言下哦。

言规正转,我们要将别人写好的Intent,那肯定要使用隐式Intent的方式来启用了,这里使用的是匹配Action:MediaStore.ACTION_IMAGE_CAPTURE,具体的值是:

(MediaStore.java)

拍照:(MediaStore.ACTION_IMAGE_CAPTURE)

public static final java.lang.String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";

启用相册:(Intent.ACTION_GET_CONTENT)

public static final java.lang.String ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT";

启用裁剪:

com.android.camera.action.CROP

有关启用隐式Intent和显式Intent的方式参看这两篇文章:《 intent详解(一)》、《intent详解(二)》
要使用相应的功能是通过Intent.PutExtra("key",value);来实现的,对应的KEY和Valude

Exta Options Table for image/* crop:

附加选项 数据类型 描述
crop String 发送裁剪信号
aspectX int X方向上的比例
aspectY int Y方向上的比例
outputX int 裁剪区的宽
outputY int 裁剪区的高
scale boolean 是否保留比例
return-data boolean 是否将数据保留在Bitmap中返回
data Parcelable 相应的Bitmap数据
circleCrop String 圆形裁剪区域?
MediaStore.EXTRA_OUTPUT ("output") URI 将URI指向相应的file:///...,详见代码示例
outputFormat String 输出格式,一般设为Bitmap格式:Bitmap.CompressFormat.JPEG.toString()
noFaceDetection boolean 是否取消人脸识别功能

这些参数是可以选择性使用的,想使用哪个功能就直接写上,不使用就不写,下面我们就一个个试试。这里我会始终将return_data设为false,因为如何设为TRUE,那对于有些手机而言,只会得到缩略图,所以这里一致用URI来输出。而URI在有些手机上也是存在问题的,这里先不谈,先用URI,因为这是网上一致认为的终极方案………………

写在前面:

由于我们会读写SD卡,所以先在AndroidManifest.xml中添加上SD卡的读写权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

二、仅拍照

(1)、核心代码:

我们仅仅使用拍照的功能,而且将其输出到URI中,代码如下:

启用拍照Activity

private static final int RESULT_CAMERA_ONLY = 100;

先构造一个temp.jpg的URI

String path = getSDCardPath();
File file = new File(path + "/temp.jpg");
imageUri = Uri.fromFile(file);

然后通过MediaStore.ACTION_IMAGE_CAPTURE来隐式调起拍照Intent;

然后将返回值设为false,并将MediaStore.EXTRA_OUTPU输出指定为 imageUri;

然后将URI的输出格式设为JPEG,这是因为我们在构造URI时,使用的JPG格式:temp.jpg

        Intent intent = null;intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);startActivityForResult(intent, RESULT_CAMERA_ONLY);

大家可能对return-data和MediaStore.EXTRA_OUTPUT的作用有些迷糊;

return-data:是将结果保存在data中返回,在onActivityResult中,直接调用intent.getdata()就可以获取值了,这里设为fase,就是不让它保存在data中

MediaStore.EXTRA_OUTPUT:由于我们不让它保存在Intent的data域中,但我们总要有地方来保存我们的图片啊,这个参数就是转移保存地址的,对应Value中保存的URI就是指定的保存地址。至于这两个参数能不能同时设为输出,这个我也不清楚……

在onActivityResult中接收:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != Activity.RESULT_OK)return;switch (requestCode) {case RESULT_CAMERA_ONLY: {try {Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));mImage.setImageBitmap(bitmap);} catch (Exception e) {e.printStackTrace();}}break;}
}

将接收到的ImageUri解析为Bitmap,因为我们的URI本来就是个Bitmap,然后将其设置到一个ImageView中显示;

但在有的手机中ImageView并不会显示这个Bitmap,而查看根目录下的temp.jpg确实已经生成了。这是为什么?

查看日志,报了个错:

Bitmap too large to be uploaded into a texture (3120x4160, max=4096x4096)

这是因为Bitmap太大了,超出了ImageView的显示范围所致,这里有三种解决办法:

1、强制显示,关闭OpenGL加速(容易导致OOM)
在AndroidManifest.xml中,application标签下添加一个属性:

android:hardwareAccelerated="false"

即:

    <application……android:hardwareAccelerated="false"></application>   ……android:hardwareAccelerated="false"></application>

2、将图片缩小

将指定图片缩小SCALE倍的代码如下:

但如果图片足够大,缩小后也不定能显示……

private Bitmap setScaleBitmap(Bitmap photo,int SCALE) {if (photo != null) {//为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始Bitmap占用的内存//这里缩小了1/2,但图片过大时仍然会出现加载不了,但系统中一个BITMAP最大是在10M左右,我们可以根据BITMAP的大小//根据当前的比例缩小,即如果当前是15M,那如果定缩小后是6M,那么SCALE= 15/6Bitmap smallBitmap = zoomBitmap(photo, photo.getWidth() / SCALE, photo.getHeight() / SCALE);//释放原始图片占用的内存,防止out of memory异常发生photo.recycle();return smallBitmap;}return null;
}
public Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {int w = bitmap.getWidth();int h = bitmap.getHeight();Matrix matrix = new Matrix();float scaleWidth = ((float) width / w);float scaleHeight = ((float) height / h);matrix.postScale(scaleWidth, scaleHeight);// 利用矩阵进行缩放不会造成内存溢出Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);return newbmp;
}

3、分块显示
看这里《解决:Bitmap too large to be uploaded into a texture exception》

(2)、实例

效果图:

点击按钮调起系统相册拍照,然后显示在ImageView中

    

1、AndroidManifest.xml添加SD卡读写权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

2、主布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_camera_only"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="仅拍照"/><ImageViewandroid:id="@+id/image_result"android:layout_width="200dip"android:layout_height="200dip"android:scaleType="centerInside"android:layout_gravity="center_horizontal"/></LinearLayout>

3、主程序(MainActivity.java)
三个变量:

private static final int RESULT_CAMERA_ONLY = 100;
private ImageView mImage;
private Uri imageUri;

其中imageUri用来保存拍照后存储的数据;

OnCreate()函数:

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String path = getSDCardPath();File file = new File(path + "/temp.jpg");imageUri = Uri.fromFile(file);mImage = (ImageView)findViewById(R.id.image_result);Button btn_take_camera_only = (Button)findViewById(R.id.btn_camera_only);btn_take_camera_only.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {takeCameraOnly();}});
}

做了两件事:

第一:初始化imageUri

其中的getSDCardPath()是自己写的函数,下面会给出源码;

第二:在点击按钮时调起相机:

private void takeCameraOnly(){Intent intent = null;intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//action is captureintent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);startActivityForResult(intent, RESULT_CAMERA_ONLY);
}

然后对返回的数据进行处理:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != Activity.RESULT_OK)return;switch (requestCode){case RESULT_CAMERA_ONLY:{try {Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));mImage.setImageBitmap(bitmap);} catch (Exception e) {e.printStackTrace();}}break;}
}

其中的获取SD卡路径的代码为:

public static String getSDCardPath() {String cmd = "cat /proc/mounts";Runtime run = Runtime.getRuntime();// 返回与当前 Java 应用程序相关的运行时对象try {Process p = run.exec(cmd);// 启动另一个进程来执行命令BufferedInputStream in = new BufferedInputStream(p.getInputStream());BufferedReader inBr = new BufferedReader(new InputStreamReader(in));String lineStr;while ((lineStr = inBr.readLine()) != null) {// 获得命令执行后在控制台的输出信息if (lineStr.contains("sdcard")&& lineStr.contains(".android_secure")) {String[] strArray = lineStr.split(" ");if (strArray != null && strArray.length >= 5) {String result = strArray[1].replace("/.android_secure","");return result;}}// 检查命令是否执行失败。if (p.waitFor() != 0 && p.exitValue() == 1) {// p.exitValue()==0表示正常结束,1:非正常结束}}inBr.close();in.close();} catch (Exception e) {return Environment.getExternalStorageDirectory().getPath();}return Environment.getExternalStorageDirectory().getPath();
}

源码会在文章底部给出

三、拍照及裁剪初步实现

效果图:

点击按钮弹出拍照Intent,然后进入裁剪Intent,最后将裁剪后的图显示在ImageView中;

(一)                                (二)

  

(三)                                 (四)

  

在第一节说过,上面的几个参数是可以随意匹配使用的,那我们直接加上裁剪选项,并将结果存在imageUri中,看看会怎样。

那我们在上面的纯拍照的代码中加以修改,在点击按钮时,强制拍照Intent,然后结果自己加入裁剪Intent中,结果同样存在imageUri中;

OnCreate()中:

    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String path = getSDCardPath();File file = new File(path + "/temp.jpg");imageUri = Uri.fromFile(file);mImage = (ImageView) findViewById(R.id.image_result);Button btn_take_camera_only = (Button) findViewById(R.id.btn_camera_only);btn_take_camera_only.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {takeCameraCropUri();}});}

开启拍照及裁剪功能:

    private void takeCameraCropUri() {Intent intent = null;intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//action is captureintent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 1000);intent.putExtra("outputY", 1000);intent.putExtra("scale", true);intent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);startActivityForResult(intent, RESULT_CAMERA_CROP_URI);}

结果接收:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != Activity.RESULT_OK)return;switch (requestCode) {case RESULT_CAMERA_CROP_URI: {try {Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));//出不来mImage.setImageBitmap(bitmap);} catch (Exception e) {e.printStackTrace();}}break;}}

一切看起来那么美好,但一运行会发现——拍照完成之后崩了!!!!!!

为什么会这样!!!!我也不知道怎么找源码,只能靠猜了……个人认为,我们把最终结果存在了imageUri中,但从拍照Intent到裁剪Intent之间结果是怎么传的呢?估计是通过Intent中的data来传的,当数据过大,即超过1M时就崩了!!!!

所以我们要想办法分离这个过程,将中间数据先暂存一下,然后再调裁剪Intent,最后把结果存在Uri中。

基于这个想法,下面看看具体实现过程:

四、拍照及裁剪终极方案

首先声明两个Uri,一个保存拍照的结果,一个保存裁剪的结果:

    private static final int RESULT_CAMERA_ONLY = 100;private static final int RESULT_CAMERA_CROP_PATH_RESULT = 301;private ImageView mImage;private Uri imageUri;private Uri imageCropUri;

然后在OnCreate()函数中初始化:

    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String path = getSDCardPath();File file = new File(path + "/temp.jpg");imageUri = Uri.fromFile(file);File cropFile = new File(getSDCardPath() + "/temp_crop.jpg");imageCropUri = Uri.fromFile(cropFile);mImage = (ImageView) findViewById(R.id.image_result);Button btn_take_camera_only = (Button) findViewById(R.id.btn_camera_only);btn_take_camera_only.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {takeCameraOnly();}});}

点击按钮时仅调起拍照Intent,将结果存在imageUri中

    private void takeCameraOnly() {Intent intent = null;intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//action is captureintent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);startActivityForResult(intent, RESULT_CAMERA_ONLY);}

在接收到返回的消息后,调起裁剪Intent:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != Activity.RESULT_OK)return;switch (requestCode) {case RESULT_CAMERA_ONLY: {cropImg(imageUri);}break;}}

其中cropImg(Uri uri)是调起裁剪Intent,代码如下:

public void cropImg(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 700);intent.putExtra("outputY", 700);intent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageCropUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);startActivityForResult(intent, RESULT_CAMERA_CROP_PATH_RESULT);
}

将传进去的uri做为源数据,即被裁剪的数据,将结果存储在imageCropUri中;

然后接收返回的结果:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != Activity.RESULT_OK)return;switch (requestCode) {case RESULT_CAMERA_ONLY: {cropImg(imageUri);}break;case RESULT_CAMERA_CROP_PATH_RESULT: {Bundle extras = data.getExtras();if (extras != null) {try {Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageCropUri));mImage.setImageBitmap(bitmap);} catch (Exception e) {e.printStackTrace();}}}break;}}

将存储裁剪结果的imageCropUri,转换为Bitmap,然后在ImageView中显示;
完整的代码如下:

public class MainActivity extends Activity {private static final int RESULT_CAMERA_ONLY = 100;private static final int RESULT_CAMERA_CROP_PATH_RESULT = 301;private ImageView mImage;private Uri imageUri;private Uri imageCropUri;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String path = getSDCardPath();File file = new File(path + "/temp.jpg");imageUri = Uri.fromFile(file);File cropFile = new File(getSDCardPath() + "/temp_crop.jpg");imageCropUri = Uri.fromFile(cropFile);mImage = (ImageView) findViewById(R.id.image_result);Button btn_take_camera_only = (Button) findViewById(R.id.btn_camera_only);btn_take_camera_only.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {takeCameraOnly();}});}private void takeCameraOnly() {Intent intent = null;intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//action is captureintent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);startActivityForResult(intent, RESULT_CAMERA_ONLY);}public void cropImg(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 700);intent.putExtra("outputY", 700);intent.putExtra("return-data", false);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageCropUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);startActivityForResult(intent, RESULT_CAMERA_CROP_PATH_RESULT);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode != Activity.RESULT_OK)return;switch (requestCode) {case RESULT_CAMERA_ONLY: {cropImg(imageUri);}break;case RESULT_CAMERA_CROP_PATH_RESULT: {Bundle extras = data.getExtras();if (extras != null) {try {Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageCropUri));mImage.setImageBitmap(bitmap);} catch (Exception e) {e.printStackTrace();}}}break;}}public static String getSDCardPath() {String cmd = "cat /proc/mounts";Runtime run = Runtime.getRuntime();// 返回与当前 Java 应用程序相关的运行时对象try {Process p = run.exec(cmd);// 启动另一个进程来执行命令BufferedInputStream in = new BufferedInputStream(p.getInputStream());BufferedReader inBr = new BufferedReader(new InputStreamReader(in));String lineStr;while ((lineStr = inBr.readLine()) != null) {// 获得命令执行后在控制台的输出信息if (lineStr.contains("sdcard")&& lineStr.contains(".android_secure")) {String[] strArray = lineStr.split(" ");if (strArray != null && strArray.length >= 5) {String result = strArray[1].replace("/.android_secure","");return result;}}// 检查命令是否执行失败。if (p.waitFor() != 0 && p.exitValue() == 1) {// p.exitValue()==0表示正常结束,1:非正常结束}}inBr.close();in.close();} catch (Exception e) {return Environment.getExternalStorageDirectory().getPath();}return Environment.getExternalStorageDirectory().getPath();}
}

到这里,这篇文章就讲完了,写的比较乱,原理应该是讲清楚了,有关从相册选择及裁剪的部分在下篇中讲解。

源码内容:

1、BlogCameraOnly:仅拍照功能

2、BlogCameraCropCrash:第三部分对应的源码,根本起不来裁剪Intent,造成Crash

3、BlogCameraCropFinally:拍照及裁剪的终极方案;

如果本文有帮到你,记得关注哦

源码下载地址:http://download.csdn.net/detail/harvic880925/8412983

请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/43163175  谢谢。

如果你喜欢我的文章,你可能更喜欢我的公众号

拍照、相册及裁剪的终极实现(一)——拍照及裁剪功能实现相关推荐

  1. Android 7.0拍照/相册/截取图片FileProvider使用

    Android 7.0拍照/相册/截取图片FileProvider使用 Android 70拍照相册截取图片FileProvider使用 GitHub地址 HIT THE PIT 需求 实现解析 一 ...

  2. android 自定义相册选择,Android图片选择器,支持拍照、从相册选择、裁剪、自定义主题...

    在很多项目中都会用到图片选择器,比如在选择头像的时候,还会要求选择图片进行裁剪后再进行上传:而有的项目要支持拍照后进行图片裁剪再进行上传.由于Android系统兼容性问题,我们不得不考虑自己实现图片裁 ...

  3. 拍照相册和裁剪保存图片集合

    1 写在前面 前两天看了下别人保存图片的方式,又看了郭神的第一行代码的拍照和打开相册,又研究了下对图片的裁剪,然后合在一起做了个demo,以后要用直接用就可以了.先说说这个代码比网上其他的代码好的地方 ...

  4. Android拍照相册裁剪封装

    Android拍照相册裁剪封装 先列出来需要解决问题 展示效果 注意事项 代码 参考资料 最近用到从相机/相册选择图片的功能,这个功能虽然不复杂,网上的代码也一大堆,但是考虑到可能以后别的地方也会用到 ...

  5. 【iOS】拍照/相册单选、相册多选、图片浏览、图片裁剪

    有一段时间没有写iOS系列的博客了.最近由于项目的需要,就有封装了一个拍照/相册单选.相册多选.图片浏览.图片裁剪的工具类.在封装这这类是站在巨人的肩膀上做的. 1.ZLPhotoBrowser:ht ...

  6. android 自定义图片裁剪,android 自定义比例裁剪图片(拍照 相册)方式 自定义比例...

    先说下我这个有啥好处 主要是能够自定义设置裁剪图片的比例.比如 :今天产品 给你说裁剪 成16:9 的图片. 你做好了 OK 明天 产品又和你说 裁剪成10:7 的图片 ,你是不是要吐血, 我这里只要 ...

  7. android --拍照相册选取图片[兼容小米等其他手机]

    前几天做项目中选择图片的过程中遇到小米手机出现不能够选取把图片放入到view中,这里是因为小米采用的是树形结构,而其他手机普遍是图形结构,本质就是url结构有些不同,小米的是绝对路径 1.定义常量: ...

  8. uniapp 实现拍照 相册选取选视频和照片

    <view class="img-show-pick" @click="showActionSheet" v-if="isEdit"& ...

  9. android webview中h5调用 拍照/相册 通用支持代码

    android webview中h5调用 拍照/相册 通用支持代码. 在webview的   WebChromeClient 中,重写 // For Android >= 5.0 @Overri ...

最新文章

  1. Java数据结构简述
  2. MyBatis常见面试题汇总
  3. jqgrid学习(1)
  4. 透视惠普“返修机事件”
  5. php菲波那切数列,php如何实现菲波那切数列
  6. Android 底部上拉抽屉view
  7. 蓝桥杯单片机stc15f2k61s2矩阵按键中断扫描代码
  8. PAT乙级(1017 A除以B)
  9. SpringCloud工作笔记035---Zuul网关异常:com.netflix.zuul.exception.ZuulException: Forwarding error
  10. OpenLayers之官网实例
  11. 51Nod 1637 幸运数字转换(思维)
  12. [原创]:善用佳软(二)
  13. Chromium OS Autotest 概述
  14. 程序员有哪些类型,分别薪资是多少,带你一起走进程序员的大门
  15. 数据集-知识图谱:FreeBase(通用知识图谱)【英文】
  16. 男人一生的四菜一汤(转载)
  17. 超级计算机排名太湖之光,神威•太湖之光继续“称霸”超级计算机排行榜 美国无缘前三...
  18. 【Google Chrome】reCAPTCHA did not get loaded.
  19. 大厂秋招~华为荣耀字节腾讯美团滴滴
  20. python身份验证(身份证号中提取出生日期及性别)。

热门文章

  1. Java使用XDocReport导出Word(带图片)
  2. 什么是TTL电平、CMOS电平?两者的区别
  3. iOS UI 之聊天室渐变蒙层效果
  4. 贪心算法之优惠券问题-Gifts[USACO-2012-JAN-B]——zzx的博客
  5. mysql 查询重复记录 取第一条_取出重复记录的第一条
  6. 二十三种常见设计模式-简介
  7. 前端邮箱模版开发实现
  8. Linux内核中oops 错误解析以及问题定位
  9. python之文件与数据格式化
  10. 深入分析Java中打印对象内存地址 System.identityHashCode()方法