实现功能:浏览器、拍照、摄像、截屏、电话
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);//设置资源
}
}