安卓开发-自定义照相机界面

安卓开发-自定义照相机界面

此项目是总结了其他三位大佬的代码后写出来的,在此首先感谢三位大佬:

自定义照相机编写方法:https://blog.csdn.net/shan286/article/details/53189034
解决照相机拍的照片像素低的方法:https://blog.csdn.net/w6718189/article/details/104501618?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242
浏览图片放大缩小方法:https://blog.csdn.net/lpcrazyboy/article/details/80777112

话不多说,先上图片

1.主界面

2.点击系统组件拍照按钮后跳转的界面

3.点击拍照按钮后的界面

4.点击确定按钮后(我的设备里确定按钮就是那个√),返回首页并展示选择拍摄图片的界面

5.点击自定义组件拍照按钮后的界面

6.点击中间的拍照按钮后进入的照片预览界面

7.点击使用图片后返回主页面并展示图片

下面开始贴代码:

MainAcitivity:

package com.mobile.takephotodemo;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {
    private Button btn_takephoto_amn, btn_takephotocam_amn;
    private ImageView iv_photo_ato;
    private int REQUEST_CODE = 1;
    public static final int REQUEST_CODE_READ = 3;
    public static final int REQUEST_CODE_WRITE = 2;
    private String mFilePath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//代码初始化
        setClick();//设置点击方法
        getInfo();//获取其他界面传递过来的信息
    }

    /**
     * 获取其他界面传递过来的信息
     */
    private void getInfo() {
        try {
            String path = getIntent().getStringExtra("picpath");//通过值"picpath"得到照片路径
            FileInputStream fis = new FileInputStream(path);//通过path把照片读到文件输入流中
            Bitmap bitmap = BitmapFactory.decodeStream(fis);//将输入流解码为bitmap
            Matrix matrix = new Matrix();//新建一个矩阵对象
            matrix.setRotate(90);//矩阵旋转操作让照片可以正对着你。但是还存在一个左右对称的问题
//新建位图,第2个参数至第5个参数表示位图的大小,matrix中是旋转后的位图信息,并使bitmap变量指向新的位图对象
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            iv_photo_ato.setImageBitmap(bitmap);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 设置点击方法
     */
    private void setClick() {
        btn_takephoto_amn.setOnClickListener(new MainActivityClick());
        btn_takephotocam_amn.setOnClickListener(new MainActivityClick());
    }

    /**
     * 代码初始化
     */
    private void initView() {
        iv_photo_ato = findViewById(R.id.iv_photo_ato);//展示拍照图片的控件
        btn_takephoto_amn = findViewById(R.id.btn_takephoto_amn);//调用系统组件拍照
        btn_takephotocam_amn = findViewById(R.id.btn_takephotocam_amn);//调用自定义组件拍照
    }

    /**
     * 设置点击方法
     */
    private class MainActivityClick implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_takephoto_amn://拍照按钮的点击方法
//                    Toast.makeText(MainActivity.this, "拍照按钮", Toast.LENGTH_SHORT).show();
                    checkPermissions();//获取用户权限
                    break;
                case R.id.btn_takephotocam_amn://进入自定义拍照界面
                    checkotherPermissions();//获取用户权限
                    break;
                default:
                    break;
            }
        }
    }

    /**
     * 自定义拍照界面获取权限
     */
    private void checkotherPermissions() {
        boolean canWrite = isWriteStoragePermissionGranted();//获取写的权限
//        Log.d(TAG, " canWrite :" + canWrite);
        if (canWrite) {
            boolean canRead = isReadStoragePermissionGranted();//获取读的权限
//            Log.d(TAG, " canRead :" + canRead);
            if (canRead) {
//                Log.d(TAG, " Now you are ready to access camera :");
                startActivity(new Intent(MainActivity.this, Customcamera.class));
            }
        }

    }

    /**
     * 获取用户权限
     */
    private void checkPermissions() {
        boolean canWrite = isWriteStoragePermissionGranted();//获取写的权限
//        Log.d(TAG, " canWrite :" + canWrite);
        if (canWrite) {
            boolean canRead = isReadStoragePermissionGranted();//获取读的权限
//            Log.d(TAG, " canRead :" + canRead);
            if (canRead) {
//                Log.d(TAG, " Now you are ready to access camera :");
                callCamera();
            }
        }
    }


    /**
     * 打开照相机
     */
    private void callCamera() {
        mFilePath = Environment.getExternalStorageDirectory().getPath();
        // 保存图片的文件名
        SimpleD
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值