1.FileProvider 继承Provider
2.使用步骤:
1.在项目 res/xml 里面新建一个 paths.xml 文件
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="images/"
path="testimages" />
</paths>
2.在manifest 里面声明一个FileProvider
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="cn.uflycn.com.providerdemo.fileprovider"// uri
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/paths" />
</provider>
3.使用这个provider 下面举个栗子 使用这个fileprovider 打开系统拍照 显示图片
package cn.uflycn.com.providerdemo;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_TAKEPHOTO_CODE = 0;
private String mPhotoPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
takePhoto();
}
});
}
void takePhoto() {
Intent takePhotoIntent = new Intent();
takePhotoIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePhotoIntent.resolveActivity(getPackageManager()) != null) {
String fileName = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.CHINA).
format(new Date()) + ".png";
//如果 文件夹不存在 会出现拍照无法返回
// 如果文件路径错了 会报错
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "testimages"+ File.separator + fileName);
if(!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
mPhotoPath = file.getAbsolutePath();
Uri fileUri = FileProvider.getUriForFile(this, "cn.uflycn.com.providerdemo.fileprovider", file);
takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
takePhotoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(Intent.createChooser(takePhotoIntent,"拍照"), REQUEST_TAKEPHOTO_CODE);
}
}
//demo未考虑 耗时问题
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if (requestCode == REQUEST_TAKEPHOTO_CODE) {
if (resultCode == RESULT_OK) {
ImageView imageView = findViewById(R.id.imageView);
Bitmap bitmap = BitmapFactory.decodeFile(mPhotoPath);
imageView.setImageBitmap(bitmap);
}
}
}
}