Android问题与解决方案:调用系统相机拍照并返回图片

版权声明:本文为博主原创文章,转载请注明原文链接 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

猜你喜欢

转载自blog.csdn.net/sailist/article/details/81941380