Java 捕获相机图像并放入Gridview

Java 捕获相机图像并放入Gridview,java,android,Java,Android,我有个问题。我使用bumtech glid库,当我单击并尝试捕获相机图像时,它总是成为一个错误: 6-01 02:17:06.217 1696-1696/com.sportfriend.app E/AndroidRuntime: FATAL EXCEPTION: main Process: com.sportfriend.app, PID: 1696 android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/S

我有个问题。我使用bumtech glid库,当我单击并尝试捕获相机图像时,它总是成为一个错误:

6-01 02:17:06.217 1696-1696/com.sportfriend.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sportfriend.app, PID: 1696
android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/Sportfriend/SF20170601021706.jpg exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
at android.net.Uri.checkFileUriExposed(Uri.java:2346)
at android.content.ClipData.prepareToLeaveProcess(ClipData.java:845)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8941)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8926)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
at android.app.Activity.startActivityForResult(Activity.java:4225)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:4183)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at com.sportfriend.app.GalleryActivityMain.cameraIntent(GalleryActivityMain.java:140)
at com.sportfriend.app.GalleryActivityMain.getPhoto(GalleryActivityMain.java:82)
at com.sportfriend.app.GalleryActivityMain.access$000(GalleryActivityMain.java:28)
at com.sportfriend.app.GalleryActivityMain$1.onClick(GalleryActivityMain.java:56)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
大宗报价

公共类GalleryActivityMain扩展了AppCompativeActivity{
私人按钮btnPhoto;
私有GridView GridView;
私有GridViewAdapter gridAdapter;
私人物品清单;
私有字符串imagePath=“”;
私有文件myDir;
私有文件路径;
私有静态最终整数请求\图像\捕获=1;
私有静态最终整数请求\外部\存储\结果=2;
专用静态最终int请求\摄像机\结果=3;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u main\u gallery);
createAppDirectory();
imagePath=Environment.getExternalStorageDirectory().toString()+“/Sportfriend”;
imageItems=新的ArrayList();
btnPhoto=(按钮)findViewById(R.id.btnPhoto);
btnPhoto.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
getPhoto();
}
});
getImages();
gridView=(gridView)findViewById(R.id.gridView);
gridAdapter=新的GridViewAdapter(此,R.layout.grid_项,imageItems);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图v、整型位置、长id){
字符串imagePath=((TextView)v.findviewbyd(R.id.text)).getText().toString();
意向意向=新意向(GalleryActivityMain.this,DetailActivity.class);
intent.putExtra(“imagePath”,imagePath);
星触觉(意向);
}
});
setAdapter(gridAdapter);
}
私有void getPhoto(){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
if((ContextCompat.checkSelfPermission(this,android.Manifest.permission.CAMERA)==PackageManager.permission_provided)){
if((ContextCompat.checkSelfPermission(this,android.Manifest.permission.WRITE_EXTERNAL_STORAGE)=PackageManager.permission_grated)){
cameraIntent();
}否则{
if(shouldshowRequestPermissionRegulation(android.Manifest.permission.WRITE\u外部存储)){
Toast.makeText(这是“Berechtigung zum Speichen ben�tigt“,吐司。长度(长)。show();
}
requestPermissions(新字符串[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},请求_EXTERNAL_STORAGE_RESULT);
}
}否则{
if(shouldShowRequestPermissionRegulation(android.Manifest.permission.CAMERA)){
Toast.makeText(这是“Berechtigung zum Speichen ben�tigt“,吐司。长度(长)。show();
}
requestPermissions(新字符串[]{android.Manifest.permission.CAMERA},REQUEST\u CAMERA\u RESULT);
}
}否则{
cameraIntent();
}
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
if(requestCode==请求\外部\存储\结果){
if(grantResults[0]==已授予PackageManager.权限){
getPhoto();
}否则{
Toast.makeText(这个“Berechtigung verweigert!!!”,Toast.LENGTH\u LONG.show();
}
}else if(requestCode==请求\摄像机\结果){
if(grantResults[0]==已授予PackageManager.权限){
getPhoto();
}否则{
Toast.makeText(这是“Kein Zugriff auf照相机”,Toast.LENGTH_LONG.show();
}
}否则{
super.onRequestPermissionsResult(请求代码、权限、授权结果);
}
}
私有void createAppDirectory(){
String root=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
myDir=新文件(root+“/Sportfriend”);
如果(!myDir.exists()){
myDir.mkdirs();
}
}
私人帐篷{
SimpleDataFormat formatter=新的SimpleDataFormat(“yyyyMMddHHmmss”,java.util.Locale.getDefault());
日期=新日期();
字符串sDate=格式化程序。格式(日期);
字符串imageName=“SF”+sDate+“.jpg”;
试一试{
意向意向=新意向(MediaStore.ACTION\u IMAGE\u CAPTURE);
filePath=新文件(myDir,imageName);
intent.putExtra(MediaStore.EXTRA_输出,Uri.fromFile(filePath));
startActivityForResult(意图、请求、图像捕获);
}捕获(ActivityNotFounde异常){
String errorText=“Funktion wird auf Ihren Ger�一点也不�tzt!”;
Toast.makeText(this,errorText,Toast.LENGTH_LONG).show();
}
}
私有列表getImages(){
新文件(imagePath).mkdirs();
File fileTarget=新文件(imagePath);
File[]files=fileTarget.listFiles();
imageItems.clear();
如果(文件!=null){
用于(文件:文件){
add(file.getAbsolutePath());
}
}
归还物品;
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据)
{
getImages();
gridAdapter.notifyDataSetChanged();
}

}
您的目标是Sdk版本24或更高版本吗?您好,是的,我使用Sdk 24+,,我还尝试了使用genymotion虚拟设备的Sdk 22我已经阅读了这篇文章,但我没有找到使用这段代码的方法:Uri photoURI=FileProvider.getUriForFile(context,context.getApplicationContext().getPackageName()+“.provider”,createImageFile());在我的相机意图代码中,在您的相机意图方法应用条件中
private void cameraIntent()
{
    if (Build.VERSION.SDK_INT >= 23)
    {
        File path = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera");
        if (!path.exists()) path.mkdirs();
        File image = new File(path, "image.jpg");
        Uri imageUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", image);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        startActivityForResult(intent, REQUEST_CAMERA);
    }
    else
    {
        File path = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera");
        if (!path.exists()) path.mkdirs();
        File image = new File(path, "image.jpg");
        Uri imageUri = Uri.fromFile(image);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, REQUEST_CAMERA);
    }
}