Android拍照本地相册选择图

引语:天行健,君子以自强不息"(乾卦)"地势坤,君子以厚德载物"(坤卦)

对于大多数Android开发者来说,(拍照+本地相册)选择图片是再平常不过的功能,几乎每一个APP都会用到,但是现今的Android市场,机型,版本等各个方面都存在着不同,那么如何找到一个合适自己的方式呢?下面我们将封装一套属于自己的图片选择器。

一、选择图片

选择图片,无外乎拍照和本地相册选择,那么在Android手机中如何实现呢?

A、启动本地相册(2种方式)

第一种方式:

Intentintent=newIntent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

Activity.startActivity(intent);

第二种方式:

Intentintent=newIntent(Intent.ACTION_GET_CONTENT);

intent.setType("image/*");

Activity.startActivity(intent);

B、启动拍照

Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);

Activity.startActivity(intent);

注意:要添加拍照权限。

二、保存选中图片

当选择图片完之后,需要将选中的图片进行保存,一般保存到一个临时文件当中。而我们的最终目的是把选中的图片,供外界使用(初始Activity/Fragment)。这个时候就要使用startActivityForResult来启动拍照或本地相册。

如下:启动本地相册和启动拍照可以写出如下形式。

启动本地相册:

Intentintent=newIntent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

Activity.startActivityForResult(intent,RESULT_LOAD_CODE);

启动拍照:将拍照图片保存到一个临时文件当中。

try{if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//创建文件夹booleanisSuccess=true;FiledirFile=newFile(Environment.getExternalStorageDirectory().getAbsolutePath(),"photoCache");if(!dirFile.exists()){isSuccess=dirFile.mkdirs();}if(isSuccess){//创建文件StringimgPath=dirFile.getAbsolutePath()+File.separator+System.currentTimeMillis()+".png";FileimgFile=newFile(imgPath);UriphotoUri=Uri.fromFile(imgFile);IntentopenCameraIntent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);Activity.startActivityForResult(openCameraIntent,RESULT_PHOTO_CODE);}}else{Toast.makeText(context,"SD卡不存在,请插入SD卡!",Toast.LENGTH_SHORT).show();}}catch(Exceptione){e.printStackTrace();}三、封装选择图片Dialog

A、创建选择图片管理类(这里只是对上面的分析,进行进一步的封装),这里我创建一个叫做ChoosePictrueUtil的类,封装对拍照和从本地相册选择方法,如下:

其中ZDialogConstantUtil类是用来保存常量。

publicclassChoosePictrueUtil{publicstaticUriphotoUri;//拍照URI,拍照相对于新生产的,所有要进行转换publicstaticStringimgPath;//图片地址//生成一个URI地址publicstaticUricreateImageViewUri(Contextcontext){Stringname="tmp"+System.currentTimeMillis();ContentValuesvalues=newContentValues();values.put(MediaStore.Images.Media.TITLE,name);values.put(MediaStore.Images.Media.DISPLAY_NAME,name+".png");values.put(MediaStore.Images.Media.MIME_TYPE,"image/*");returncontext.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);}//刪除URIpublicstaticvoiddeleteUri(Contextcontext,Uriuri){if(uri!=null){context.getContentResolver().delete(uri,null,null);}}//启动拍照1publicstaticvoidstartPhoto(Contextcontext){photoUri=createImageViewUri(context);if(photoUri!=null){Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);//将拍照后的图像保存到photoUri((Activity)context).startActivityForResult(intent,ZDialogConstantUtil.RESULT_PHOTO_CODE);}}//启动拍照2publicstaticvoidstartPhoto2(Contextcontext){Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);((Activity)context).startActivityForResult(intent,ZDialogConstantUtil.RESULT_PHOTO_CODE);}//启动拍照3publicstaticvoidstartPhoto3(Contextcontext){try{if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//创建文件夹booleanisSuccess=true;FiledirFile=newFile(Environment.getExternalStorageDirectory().getAbsolutePath(),"photoCache");if(!dirFile.exists()){isSuccess=dirFile.mkdirs();}if(isSuccess){//创建文件imgPath=dirFile.getAbsolutePath()+File.separator+System.currentTimeMillis()+".png";FileimgFile=newFile(imgPath);photoUri=Uri.fromFile(imgFile);IntentopenCameraIntent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);((Activity)context).startActivityForResult(openCameraIntent,ZDialogConstantUtil.RESULT_PHOTO_CODE);}}else{Toast.makeText(context,"SD卡不存在,请插入SD卡!",Toast.LENGTH_SHORT).show();}}catch(Exceptione){e.printStackTrace();}}//从相册中获取1publicstaticvoidstartLocal(Contextcontext){//调用android的图库Intentintent=newIntent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);((Activity)context).startActivityForResult(intent,ZDialogConstantUtil.RESULT_LOAD_CODE);}//从相册中获取2publicstaticvoidstartLocal2(Contextcontext){//调用android的图库Intentintent=newIntent(Intent.ACTION_GET_CONTENT);intent.setType("image/*");((Activity)context).startActivityForResult(intent,ZDialogConstantUtil.RESULT_LOAD_CODE);}}

B、选择图片Dialog。

选择图片Dialog

如何自定义这个Dialog呢?其实就是将一个将布局和对于操作方式封装到一个类当中即可,这里我创建一个叫做ChoosePictrueDialog的类。

首先:XML布局,对于上面的布局来说,一个线性布局包裹三个Button即可。

其实:定义一个Dialog操作类,同时要对当前布局文件内容进行操作。

思路:创建ChoosePictrueDialog,在该类中定义一个全局变量Dialog,在该类进行创建操作的时候,进行Dialog初始化,同时将初始化XML布局控件,并设置布局文件三个Button的点击事件,最后将XML文件添加到Dialog中去。

Dialogdialog=newDialog(context,R.style.diydialog);

Viewview=LayoutInflater.from(context).inflate(R.layout.layout_choose_pictrue,null);

/**对于按钮的点击事件监听,这里略过。**/

dialog.setContentView(view);

这里有一个地方需要注意,由于Android6.0之后,对权限的限制非常多,在启动拍照的时候要对SD和系统拍照进行操作,所以这里几个权限的判断必不可少。

//启动拍照

publicvoidstartPhoto(){

//判断是否需要拍照权限

intcheckCallPhonePermission=ContextCompat.checkSelfPermission(context,Manifest.permission.CAMERA);

if(checkCallPhonePermission!=PackageManager.PERMISSION_GRANTED){

ActivityCompat.requestPermissions((Activity)context,newString[]{Manifest.permission.CAMERA},ZDialogConstantUtil.PERMISSION_CAMERA_REQUEST_CODE);

}else{

//判断是否需要sdcard中读取数据的权限

intcheckCallSDReadPermission=ContextCompat.checkSelfPermission(context,Manifest.permission.READ_EXTERNAL_STORAGE);

if(checkCallSDReadPermission!=PackageManager.PERMISSION_GRANTED){

ActivityCompat.requestPermissions((Activity)context,newString[]{Manifest.permission.READ_EXTERNAL_STORAGE},ZDialogConstantUtil.PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE);

}else{

//判断是否需要写入数据到扩展存储卡(SD)的权限

intcheckCallSDWritePermission=ContextCompat.checkSelfPermission(context,Manifest.permission.WRITE_EXTERNAL_STORAGE);

if(checkCallSDWritePermission!=PackageManager.PERMISSION_GRANTED){

ActivityCompat.requestPermissions((Activity)context,newString[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},ZDialogConstantUtil.PERMISSION_WRITE_EXTERNAL_STORAGE_REQUEST_CODE);

}else{

//启动拍照

ChoosePictrueUtil.startPhoto3(context);

}}

在初始化Dialog的时候,细心的同学,可能看到Dialogdialog=newDialog(context,R.style.diydialog),那么R.style.diydialog是什么呢?这个是设置Dialog主题文件,需要在styles.xml中进行书写:

stylename="diydialog"parent="

android:style/Theme.Dialog"

itemname="android:windowFrame"

null/item

!--边框--

itemname="android:windowIsFloating"true/item

!--是否浮现在activity之上--

itemname="android:windowIsTranslucent"true/item

!--半透明--

itemname="android:windowNoTitle"true/item

!--无标题--

itemname="android:windowBackground"

drawable/bg_white_gray_border/item

!--背景--

itemname="android:backgroundDimEnabled"true/item

!--是否为半透明--

/style

至于bg_white_gray_border为背景文件,是在drawable文件夹下:

layer-listxmlns:android="







































儿童白癜风能治好吗
武汉治疗白癜风医院



转载请注明:http://www.gslnbdf.com/azrj/9847.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了