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(); } }