相机与Fileprovider(实现功能:浏览器、拍照、摄像、截屏、电话):

实现功能:浏览器、拍照、摄像、截屏、电话

FileProvider的简介:
FileProvider是ContentProvider的一个特殊的子类,它让应用间共享文件变得更加容易,其通过创建一个Content URI来代替File URI。

1.首先在清单文件中加入权限:

    <!--打电话权限-->
    <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
    <!--摄像头-->
    <uses-permission android:name="android.permission.CAMERA"></uses-permission>
     <!--网络-->
    <uses-permission android:name="android.permission.INTERNET"/>
     <!--SD卡的读写-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

2.判断一下版本号,6.0以上版本动态添加权限


 private String[] strings=new String[]{
            Manifest.permission.READ_EXTERNAL_STORAGE,     //SD卡的读取权限
            Manifest.permission.WRITE_EXTERNAL_STORAGE,    //SD卡的写入权限
            Manifest.permission.CALL_PHONE,                //电话的权限
            Manifest.permission.CAMERA};                   //摄像头的权限


       //判断是否为6.0以上版本
       if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            //是否拥有权限
            if(ActivityCompat.checkSelfPermission(this,strings[0])!= PackageManager.PERMISSION_GRANTED){
            //添加权限
                requestPermissions(strings,1);
            }
        }

浏览器:

                //隐示跳转
                Intent intent = new Intent();
                //设置频道     ACTION_VIEW(浏览器)
                intent.setAction(Intent.ACTION_VIEW);
                //到哪(获取uri)
                Uri uri = Uri.parse("https://www.baidu.com");
                intent.setData(uri);
                startActivity(intent);

拨打电话:

                //隐示跳转
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_CALL);//设置频道
                //tel 加电话号
                intent.setData(Uri.parse("tel:" + "15831488471"));
                startActivity(intent);

截图:

                //获取视图
                View decorView = getWindow().getDecorView();
                //设置可以缓存
                decorView.setDrawingCacheEnabled(true);
                //缓存截图
                decorView.buildDrawingCache();
                //得到截图
                Bitmap drawingCache = decorView.getDrawingCache();
                //设置
                imageView.setImageBitmap(drawingCache);
                //存到 SD 卡
                //参数一 格式  参数二 质量  参数三 SD卡输出流
                try {
                    drawingCache.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream("/sdcard/a.jpg"));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

拍照:(返回值方法写在了最下面)
拍照功能并不会自动储存,需要我们自己在存储
1.用到内容提供者:Fileprovider继承ContentProvider(四大组件都需要在清单文件中注册);

            <!--内容提供者-->
            <provider
            android:authorities="com.example.day_10"
            android:name="androidx.core.content.FileProvider"
            android:exported="false"                          //是否允许外界访问
            android:grantUriPermissions="true">               //是否授予uri的权限
            <meta-data                                        //子内容提供
                 //文件提供路径
                android:name="android.support.FILE_PROVIDER_PATHS" 
                //资源文件
                android:resource="@xml/paths"></meta-data>
        </provider>

Fileprovider用的资源文件:
在这里插入图片描述
在这里插入图片描述
2.Activity中的实现:

                //隐示跳转
                Intent intent = new Intent();
                //设置频道——拍照
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
                //存储文件
                File file = new File("/sdcard/DCIM/img_20190813.jpg");
                //给文件获取URI形式   (上下文,清单文件中authorities的名字,存储的文件)
                uri=FileProvider.getUriForFile(MainActivity.this,"com.example.day_10",file);
                intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
                //有返回结果的跳转
                startActivityForResult(intent,103);

录像:(返回值方法写在了最下面)

                Intent intent = new Intent();
                 //设置频道——录像
                intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);//设置频道
                startActivityForResult(intent,102);

重写拍照和录像的返回值方法:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //requestCode 请求码  resultcode 结果码  data 数据包含摄像后视频的路径
        if (requestCode == 102 && resultCode == Activity.RESULT_OK) {
            //视频uri路径
            Uri uri = data.getData();
            //放到videoview播放
            videoView.setVideoURI(uri);//设置资源
            videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    videoView.start();//启动
                }
            });
        }else if(requestCode==103&&resultCode==RESULT_OK){
            imageView.setImageURI(uri);//设置资源
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值