1,。首先通过流存储数据
File outputImage = new File(getExternalCacheDir(),"outImage.jpg"),参数一为路径,二为文件名,接下来判断文件是否存在,如果存在就删除,如果不就创建。如果你的手机版本低于7.0就用Uri中的fromFile()方法将图片的路径封装成uri路径。下面我们调用我们的摄像头
1.通过Intent启动找的照相机
2.通过intent找到getExtra()指定照片的输出地址,并且填入Uri路径
3.通过startActivityForResult()方法,开启意图,并且要传入一个requestCode id 方便找到我们拍摄的照片,以便显示出来。
photo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //创建File对象,用于储存拍照后的照片 File outImage = new File(getExternalCacheDir(),"image.jpg"); try { if (outImage.exists()){ outImage.delete(); } outImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } if (Build.VERSION.SDK_INT>=24){//安卓7.0以上 mimageUri = FileProvider.getUriForFile(CameraAlbum.this,"com.example.a13522.file",outImage); }else {//低于7.0 mimageUri = Uri.fromFile(outImage); } //开启照相机 Intent intent=new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT,mimageUri); startActivityForResult(intent,TAKE_PHOTO); } }); }
startActivityForResult(intent,TAKE_PHOTO);的返回值会传给onActivity()方法通过上面传输的id,我们先通过BitmapFactory的decodeStream()方法将照片的uri解析成成Bitmap对象,并把它显示出来
protected void onActivityResult(int requestCode,int resultCode,Intent data){
switch (requestCode){
case TAKE_PHOTO:
if (resultCode==RESULT_OK){
try {
Bitmap bitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(mimageUri));
mPicture.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
}
}
最后配置清单文件
<provider
android:authorities="com.example.a13522.file"
android:name="android.support.v4.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true"
>
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"
/>
</provider>
其中的@xml/file_paths是不存在的需要我们自己创建
在sre中创建xml文件夹在里面创建xml文件
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path=""/>
</paths>
二:获取相册
首先定义一个常量作为requestCode id ,其次在点击按钮事件中添加运行权限
如果添加就执行打开相册的方法
choose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//1.添加运行权限
if (ContextCompat.checkSelfPermission(CameraAlbum.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(CameraAlbum.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else {
//如果有权限调用openAlbum();
openAlbum();
}
}
});
//2.打开相册
public void openAlbum(){
//设置意图打开相册
Intent intent= new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");//获取图片 称为:图片过滤器
startActivityForResult(intent,CHOOSE_PHOTO);//打开相册中选择的图片,参数2,可以理解为键值。传到onActivityResult()方法中
}
case CHOOSE_PHOTO:
if (resultCode==RESULT_OK){
//判断手机系统版本
// if (Build.VERSION.SDK_INT>=19){
handleImageOnKitKat(data);
// }
}
default:break;
}
private void handleImageOnKitKat(Intent data) {
String imagePath = null;
Uri uri = data.getData();
if (DocumentsContract.isDocumentUri(this,uri)){
//如果document类型的uri,则通过document id处理
String docId=DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())){
String id= docId.split(":")[1];//解析出数字格式的id
String selection= MediaStore.Images.Media._ID+"="+id;
imagePath=getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
}else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())){
Uri contentUri= ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));
imagePath= getImagePath(contentUri,null);
}else if("content".equalsIgnoreCase(uri.getScheme())){
imagePath= getImagePath(uri,null);
}else if ("file".equalsIgnoreCase(uri.getScheme())){
imagePath= uri.getPath();
}
displayImage(imagePath);
}
}
//获取图片的地址,显示在Image控件上
private void displayImage(String imagePath) {
if (imagePath!=null){
Bitmap bitmap=BitmapFactory.decodeFile(imagePath);
mPicture.setImageBitmap(bitmap);
}else {
Toast.makeText(this,"图片加载失败",Toast.LENGTH_SHORT).show();
}
}