Android系统摄像头拍摄并保存查看

时间:2023-01-28 14:32:44

首先,要再AndroidManifest配置

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"
            android:configChanges="orientation|keyboardHidden|screenSize"/>

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>


在MainActivity中

public static final int PHOTO_REQUEST_CAREMA = 1;
public static File tempFile;
private Uri imageUri;


页面中写一个点击按钮,我在这里用的ButterKnife绑定,直接粘代码

@BindView(R.id.img_pic)
    ImageView imgPic;
    @BindView(R.id.btn_pic)
    Button btnPic;
    @BindView(R.id.btn_on)
    Button btnOn;
@OnClick({R.id.btn_pic, R.id.btn_on})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.btn_pic:
                openCamera(this);
                break;
            case R.id.btn_on:
                break;
        }
    }


写一个OnActivityResult方法

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case PHOTO_REQUEST_CAREMA:
                if (resultCode == RESULT_OK) {
                    Intent intent = new Intent();
                    //打开图片文件
                    intent.setDataAndType(imageUri, "image/*");
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                        imgPic.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
    }


写一个打开相机的方法

//openCamera方法
    public void openCamera(Activity activity) {
        //获取系統版本
        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        // 打开系统相机
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // 判断存储卡是否可以用,可用进行存储
        if (hasSdcard()) {
            //保存文件
            SimpleDateFormat timeStampFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
            String filename = timeStampFormat.format(new Date());
            tempFile = new File(Environment.getExternalStorageDirectory(),
                    filename + ".jpg");
            //Android版本校验
            if (currentapiVersion < 24) {
                // 从文件中创建uri
                imageUri = Uri.fromFile(tempFile);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            } else {
                //兼容android7.0
                ContentValues contentValues = new ContentValues(1);
                contentValues.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath());
                //检查是否有存储权限
                if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {
                    //如果没有开启权限,申请WRITE_EXTERNAL_STORAGE权限
                    Toast.makeText(this, "请开启存储权限", Toast.LENGTH_SHORT).show();
                    return;
                }
                imageUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            }
        }
        // 开启一个带有返回值的Activity
        activity.startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
    }


还需要判断SdCard有没有被挂载

public static boolean hasSdcard() {
        return Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED);
    }


粘一下我的XML布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context="com.example.klaus.myapplication.MainActivity">

    <ImageView
        android:id="@+id/img_pic"
        android:layout_width="180dp"
        android:layout_height="250dp"
        app:srcCompat="@mipmap/ic_launcher_round" />

    <Button
        android:id="@+id/btn_pic"
        android:layout_width="190dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="拍摄图片" />

    <Button
        android:id="@+id/btn_on"
        android:layout_width="190dp"
        android:layout_marginTop="5dp"
        android:layout_height="wrap_content"
        android:text="上传图片" />
</LinearLayout>

好了,大概就是这样,三星华为摄像机兼容问题没有搞定,忙着加班没时间搞····

最后,我把我的源代码贴出来,有需要的小哥哥小姐姐们去github上下载吧!

https://github.com/Chinaklaus/klaus.git