Android开发 :调用系统相机拍照保存照片并显示在当前界面

主要思路:调用照相机拍照,然后为拍得的照片在SD卡新开一个储存照片的文件,然后在onActivityResult中进行照片显示

1、因为要调用照相机和SD卡所以需要在manifest.xml中添加以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--获取sd卡写的权限,用于文件上传和下载-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

如果app只运行在6.0以下系统的手机,只需要在manifest.xml中添加权限即可。

如果app也需要运行在6.0及以上系统的手机,那么除了在manifest.xml中添加权限外,还需要动态获取权限。动态请求权限的具体操作,百度即可。

2、布局文件

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="@dimen/view_height_70"
    android:background="@color/white"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/iv_btn_camera"
        android:layout_width="@dimen/view_width_60"
        android:layout_height="@dimen/view_height_60"
        android:layout_gravity="center_vertical"
        android:src="@drawable/icon_add_pic_80" />

    <ImageView
        android:id="@+id/iv_showPic"
        android:layout_width="@dimen/view_width_60"
        android:layout_height="@dimen/view_height_60" />
</LinearLayout>

3、Activity类

public class EditBookActivity extends BaseActivity {
    private ImageView iv_btn_camera;
    public static final int REQUEST_CODE = 10;
    private File file1 = null;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_order_parent);
        initElement();
        setElement();
    }

    /**
     * 初始化控件
     */
    private void initElement() {
        iv_btn_camera = (ImageView) findViewById(R.id.iv_btn_camera);

    }

    /**
     * 配置控件
     */
    private void setElement() {
        iv_btn_camera.setOnClickListener(onClickListener);
    }

    /**
     * 控件点击事件
     */
    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.iv_btn_camera:
                    if (ContextCompat.checkSelfPermission(EditBookActivity.this, Manifest.permission.CAMERA)
                            != PackageManager.PERMISSION_GRANTED) {
                        ActivityCompat.requestPermissions(EditBookActivity.this
                                , new String[]{Manifest.permission.CAMERA}, 1);
                    } else {
                        String state = Environment.getExternalStorageState();
                        if (state.equals(Environment.MEDIA_MOUNTED)) {

                            String appName = getAppName(EditBookActivity.this);
                            String path = Environment.getExternalStorageDirectory().getPath();
                            File file = new File(path + "/" + appName);
                            if (!file.exists()) {
                                if (!file.mkdirs()) {
                                    Toast.makeText(EditBookActivity.this, "创建目录失败!", Toast.LENGTH_SHORT).show();
                                }
                            }

                            file1 = new File(file.getAbsolutePath(), "/" + "服饰" + ".jpg");
                            Uri uri = getUriForFile(EditBookActivity.this, file1);
                            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                            startActivityForResult(intent, 1);
                        } else {
                            Toast.makeText(EditBookActivity.this, "未找到存储卡!", Toast.LENGTH_SHORT).show();
                        }
                    }
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == 1) {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 2;
            options.inJustDecodeBounds = false;
            Bitmap bmp = BitmapFactory.decodeFile(file1.getAbsolutePath(), options);
            iv_showPic.setImageBitmap(bmp);
            iv_showPic.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        Uri u = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(),
                                file1.getAbsolutePath(), null, null));
                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        intent.setData(u);
                        startActivity(intent);

                    } catch (FileNotFoundException e) {
                        Toast.makeText(MemberMainActivity.this, "文件未找到!", Toast.LENGTH_SHORT).show();
                    }

                }
            });
        }
    }

    /**
     * 启动EditBookActivity 
     *
     * @param context 上下文
     */
    public static void startActivity(Context context) {
        Intent intent = new Intent();
        intent.setClass(context, EditBookActivity.class);
        context.startActivity(intent);
    }

    /**
     * 请求权限后处理
     *
     * @param requestCode  请求code
     * @param permissions  权限
     * @param grantResults 返回结果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    String state = Environment.getExternalStorageState();
                    if (state.equals(Environment.MEDIA_MOUNTED)) {

                        String appName = getAppName(EditBookActivity.this);
                        String path = Environment.getExternalStorageDirectory().getPath();
                        File file = new File(path + "/" + appName);
                        if (!file.exists()) {
                            if (!file.mkdirs()) {
                                Toast.makeText(EditBookActivity.this, "创建目录失败!", Toast.LENGTH_SHORT).show();
                            }
                        }
                        file1 = new File(file.getAbsolutePath(), "/" + "服饰" + ".jpg");
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file1));
                        startActivityForResult(intent, 1);
                    } else {
                        Toast.makeText(EditBookActivity.this, "未找到存储卡!", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(this, "开通权限失败,请前往设置开通权限", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }

    }

    @Override
    protected void onRestart() {
        super.onRestart();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (file1 != null) {
            if (file1.exists()) {
                file1.delete();
            }
        }
    }
}

4、getAppName()方法

/**
 * 获取App名
 *
 * @param context 上下文
 * @return appName
 */
public static String getAppName(Context context) {
    String label = null;
    try {
        PackageManager packageManager = context.getPackageManager();
        ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0);
        label = packageManager.getApplicationLabel(applicationInfo).toString();
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return label;
}

猜你喜欢

转载自blog.csdn.net/android157/article/details/81609579