Android 访问相机拍照的爬坑日记。

来源:互联网 发布:python教程 pdf 编辑:程序博客网 时间:2024/05/11 23:14

最近被android相机拍照困扰了几天。
android6.0需要动态添加权限,在适配时不同手机对xml添加权限和动态添加要求不一样(菜鸟的个人理解)。不多说了,看代码。

public class MainActivity extends Activity {    private ImageView imageView;    private File output;    private Uri imageUri;    private Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    void initView() {        imageView = (ImageView) findViewById(R.id.image);        button = (Button) findViewById(R.id.aaaa);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                takePhone(view);            }        });    }    public void takePhone(View view) {        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)                != PackageManager.PERMISSION_GRANTED) {            ActivityCompat.requestPermissions(this,                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA},                    2);                     //动态添加权限 requestCode        } else {//           choosePhoto();            takePhoto();        }    }    /**     * 拍照     */    void takePhoto() {        /**         * 最后一个参数是文件夹的名称,可以随便起         */        File file = new File(Environment.getExternalStorageDirectory(), "拍照");        if (!file.exists()) {            file.mkdir();        }        /**         * 这里将时间作为不同照片的名称         */        output = new File(file, System.currentTimeMillis() + ".jpg");        /**         * 如果该文件夹已经存在,则删除它,否则创建一个         */        try {            if (output.exists()) {                output.delete();            }            output.createNewFile();        } catch (Exception e) {            e.printStackTrace();        }        /**         * 隐式打开拍照的Activity,并且传入CROP_PHOTO常量作为拍照结束后回调的标志         */        imageUri = Uri.fromFile(output);        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);        startActivityForResult(intent, 1);    }    //    /**//     * 从相册选取图片//     */    void choosePhoto() {        /**         * 打开选择图片的界面         */        Intent intent = new Intent(Intent.ACTION_PICK);        intent.setType("image/*");//相片类型        startActivityForResult(intent, 4);    }    // int requestCode, int resultCode, Intent data 参数 带返回类型的intent    public void onActivityResult(int requestCode, int resultCode, Intent data) {        switch (requestCode) {            /**             * 拍照的请求标志             */            case 1:                if (resultCode == RESULT_OK) {                    try {                        /**                         * 该uri就是照片文件夹对应的uri                         */                        Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));//                         图片大小的压缩//                        Bitmap bm = Bitmap.createScaledBitmap(bit, 300, 300, true);//                        比例压缩法                        Matrix matrix = new Matrix();                        matrix.setScale(0.5f, 0.5f);                        Bitmap bm = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(),                                bit.getHeight(), matrix, true);//                        当前页面显示                        imageView.setImageBitmap(bm);                        Intent intent = new Intent(MainActivity.this, Main2Activity.class);                        startActivity(intent);                        Log.i("wechat", "压缩前图片的大小" + (bit.getByteCount() / 1024 / 1024)                                + "M宽度为" + bit.getWidth() + "高度为" + bit.getHeight());                        Toast.makeText(this, "完成", Toast.LENGTH_SHORT).show();                    } catch (Exception e) {                        Toast.makeText(this, "程序崩溃", Toast.LENGTH_SHORT).show();                    }                } else {                    Log.i("tag", "失败");                }                break;            /**             * 从相册中选取图片的请求标志             *///              RESULT_OK=-1            case 4:                if (requestCode == RESULT_OK) {                    try {                        /**                         * 该uri是上一个Activity返回的                         */                        Uri uri = data.getData();                        Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));                        imageView.setImageBitmap(bit);                    } catch (Exception e) {                        e.printStackTrace();                        Log.d("tag", e.getMessage());                        Toast.makeText(this, "程序崩溃", Toast.LENGTH_SHORT).show();                    }                } else {                    Toast.makeText(this, "失败", Toast.LENGTH_SHORT).show();                }                break;            default:                break;        }    }    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        if (requestCode == 2) {            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                takePhoto();            } else {                Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();            }        }        if (requestCode == 3) {            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                choosePhoto();            } else {                Toast.makeText(MainActivity.this, "没有权限", Toast.LENGTH_SHORT).show();            }        }        super.onRequestPermissionsResult(requestCode, permissions, grantResults);    }}

布局文件activity_main。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <ImageView        android:id="@+id/image"        android:layout_width="300dp"        android:layout_height="300dp"        android:src="@mipmap/ic_launcher" />    <Button        android:id="@+id/aaaa"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="拍照" /></LinearLayout>

关于详情参考
Android拍照,相册选择图片以及Android6.0权限管理
androidbitmap压缩方法

0 0
原创粉丝点击