在app中完成拍照并显示,并且也可以通过选择相册来选择图像来显示

public class MainActivity extends AppCompatActivity {
    Uri imgUri;
    //拍照后存盘的Uri的对象
    ImageView imv;
    //ImageView 对象
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);//设置屏幕不许旋转
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置屏幕直向显示
        imv = (ImageView) findViewById(R.id.imageView);
        //引用ImageView的组件

    }
    //按钮按下后的方法
    public void onGet(View v){
        if(ActivityCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
                PackageManager.PERMISSION_GRANTED){
            //目的就是检查是否已获取写入的权限,此时表明是未获取权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},200);
            }
        else{
            //已经获取了权限
            getPhoto();
        }

    }
    //写一个方法用于接受用户允许或者拒绝权限的结果
    public void onRequestPermissionsResult(int requestCode,
                                           String[] permission,int[] grantResults){
        if(requestCode == 200){
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                getPhoto();
            }
        }
        else {
            Toast.makeText(this,"需要获取权限才可以运行",Toast.LENGTH_LONG).show();
        }

    }

    private void getPhoto(){
        imgUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                new ContentValues());
        Intent it = new Intent("android.media.action.IMAGE_CAPTURE");
        //拍照并储存到一个路径中去
        it.putExtra(MediaStore.EXTRA_OUTPUT,imgUri);
        //将uri加到拍照Intent的额外数据
        startActivityForResult(it,100);
        //启动并返回数据
    }
    protected void onActivityResult (int requestCode,int resultCode,Intent data){
        super.onActivityResult(requestCode,resultCode,data);
        if(resultCode == Activity.RESULT_OK ){
            switch (requestCode){
                case 100://拍照
                    Intent it = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,imgUri);
                    //设为系统共享媒体文件
                    sendBroadcast(it);//用广播的形式来将intent传送给系统
                    break;
                case 101://选取照片
                    imgUri = data.getData();//获取选取照片的Uri并进行格式转换
                    break;
            }

            showImg();//显示图片

        }
        else{
            Toast.makeText(this,"没有拍到照片",Toast.LENGTH_LONG).show();
        }


    }
    public void onPick(View v){
        Intent it = new Intent(Intent.ACTION_GET_CONTENT);//获取内容
        it.setType("image/*");//设置要选取的媒体类型:所有类型的图片
        startActivityForResult(it,101);
    }
    public void share(){
        //先判断是否imguri为空
        if(imgUri != null ){
            Intent it = new Intent(Intent.ACTION_SEND);
            it.setType("image/*");
            it.putExtra(Intent.EXTRA_STREAM,imgUri);
            startActivity(it);
        }
    }
    void showImg(){
        int iw,ih,vw,vh;
        boolean needRotate;//此变量用于存储是否需要旋转
        BitmapFactory.Options option = new BitmapFactory.Options();
        //创建一个选项对象
        option.inJustDecodeBounds = true;
        //设置选项,只读不载入
        try{
            //这个是一个错误处理机制
            BitmapFactory.decodeStream(
                    getContentResolver().openInputStream(imgUri), null,option);
        }catch (IOException e){
            Toast.makeText(this,"读取照片时发生错误",Toast.LENGTH_LONG).show();
            return;
        }
        iw = option.outWidth;//读出图像文件宽度
        ih = option.outHeight;//读出图像文件高度
        vw = imv.getWidth();//获取imageview的宽度
        vh = imv.getHeight();//获取imageview的高度
        //int scaleFactor = Math.min(iw/vw,ih/vh);
        int scaleFactor;
        if(iw < ih){
            needRotate = false;//不需要旋转
            scaleFactor = Math.min(iw/vw, ih/vh);//计算缩小比率
        }
        else{
            needRotate = true;//需要旋转
            scaleFactor = Math.min(ih/vw, iw/vh);//改用旋转后的图像宽、高计算缩小比例
        }
        option.inJustDecodeBounds = false;//关闭只读的选项
        option.inSampleSize = scaleFactor;//设置缩小比例,若为3,则长宽都将缩小为原来的1/3
        Bitmap bmp = null;
        try{
            //由于uri可能出错,这个是一个错误处理机制
            bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(imgUri),
                    null,option);

        }catch (IOException e){
            Toast.makeText(this,"无法读取照片",Toast.LENGTH_LONG).show();
        }
        if (needRotate){//如果需要旋转
            Matrix matrix = new Matrix();//创建一个新的Matrix对象
            matrix.postRotate(90);//设置旋转角度
            bmp = Bitmap.createBitmap(bmp,340,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
        }
        imv.setImageBitmap(bmp);
        //将Bitmap对象显示在ImageView中*/
    }

}

发布了30 篇原创文章 · 获赞 29 · 访问量 2237

猜你喜欢

转载自blog.csdn.net/weixin_41938314/article/details/80826843