版权声明:本文为博主原创文章,转载请注明原文链接 https://blog.csdn.net/sailist/article/details/81941380
第一步:设置权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
第二步:处理版本冲突
具体可以查看链接:
【Android笔记】Android 7.0 FileUriExposedException完美解决
第三步:封装获取相机存储路径和隐式意图启动相机的代码
新建一个OutputTool.java
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import static android.content.ContentValues.TAG;
/**
* Created by Sailist on 2018/8/22/0022.
*/
public class OutputTool {
private static OutputTool instance;
private OutputTool(){}
public static OutputTool getInstance()
{
if(instance == null)
{
instance = new OutputTool();
}
return instance;
}
private String mCurrentPhotoPath;
public String getmCurrentPhotoPath() {
return mCurrentPhotoPath;
}
public void setmCurrentPhotoPath(String mCurrentPhotoPath) {
this.mCurrentPhotoPath = mCurrentPhotoPath;
}
public void takeCamera(Activity activity, int num) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(activity.getApplicationContext().getPackageManager())
!= null) {
// Create the File where the photo should go
File photoFile = null;
photoFile = createImageFile(activity);
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
}
}
Log.i("void", "takeCamera: startActivity");
activity.startActivityForResult(takePictureIntent, num);//跳转界面传回拍照所得数据
Log.i("void", "takeCamera: startActivityAfter");
}
private File createImageFile(Activity activity) {
File[] files =activity.getApplicationContext().getExternalFilesDirs(Environment.DIRECTORY_DCIM);
for(File file:files){
Log.e("main", String.valueOf(file));
}
File storageDir = activity.getApplicationContext().getExternalFilesDir(Environment.DIRECTORY_DCIM);
Log.i(TAG, "createImageFile: st" + storageDir);
File image = null;
try {
image = File.createTempFile(
generateFileName(), /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
mCurrentPhotoPath = image.getAbsolutePath();
Log.i("void", "createImageFile: "+mCurrentPhotoPath);
} catch (IOException e) {
Log.i(TAG, "createImageFile: errrrr");
e.printStackTrace();
}
return image;
}
public static String generateFileName() {
String imageFileName = "JPEG_" + System.currentTimeMillis() + "_";
return imageFileName;
}
}
第四步:隐式意图启动相机
任意位置调用
OutputTool.getInstance().takeCamera(MainActivity.this,1);//这里图省事,1应该封装成常量
第五步:回调函数处理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK ) {
String url = OutputTool.getInstance().getmCurrentPhotoPath();
Log.i("result_ok", "onActivityResult: "+url);
Uri imgUrl = Uri.fromFile(new File(url));
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imgUrl));
img.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
项目已上传github