2016-12-14 52 views
4

我使用此代碼,從相機的照片,並把它的ImageView:Android攝像頭意圖FileUriExposedException的SDK> = 24

private void openCamera() 
{ 
    mMediaUri =getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

    Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    photoIntent.putExtra(MediaStore.EXTRA_OUTPUT, mMediaUri); 
    startActivityForResult(photoIntent, REQUEST_TAKE_PHOTO); 
    // dialog.dismiss(); 


} 


private Uri getOutputMediaFileUri(int mediaTypeImage) 
{ 
    //check for external storage 
    if(isExternalStorageAvaiable()) 
    { 
     File mediaStorageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES); 

     String fileName = ""; 
     String fileType = ""; 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new java.util.Date()); 

     fileName = "IMG_"+timeStamp; 
     fileType = ".jpg"; 

     File mediaFile; 
     try 
     { 
      mediaFile = File.createTempFile(fileName,fileType,mediaStorageDir); 
      Log.i("st","File: "+Uri.fromFile(mediaFile)); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
      Log.i("St","Error creating file: " + mediaStorageDir.getAbsolutePath() +fileName +fileType); 
      return null; 
     } 
     return Uri.fromFile(mediaFile); 
    } 
    //something went wrong 
    return null; 

} 

private boolean isExternalStorageAvaiable() 
{ 
    String state = Environment.getExternalStorageState(); 

    if(Environment.MEDIA_MOUNTED.equals(state)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 

    if(resultCode == DIALOG_CODE) 
    { 
     String s = data.getStringExtra("choose"); 

     if(s.equals(getString(R.string.takephoto))) 
     { 
      openCamera(); 
     } 
     else if(s.equals(getString(R.string.library))) 
     { 
     // openGallery(); 
     } 
    } 
    else if(resultCode == RESULT_OK) 
    { 
     if (requestCode == REQUEST_TAKE_PHOTO || requestCode == REQUEST_PICK_PHOTO) //dalla fotocamera 
     { 
      if (data != null) //caso galleria 
      { 
       mMediaUri = data.getData(); 
      } 


      Picasso.with(getActivity()).load(mMediaUri).resize(1280, 1280).centerCrop().into(photo, new Callback() 
      { 
       public void onSuccess() 
       { 


       } 

       @Override 
       public void onError() { 

       } 
      }); 
     } 
    } 
} 

在棉花糖它工作正常,但在牛軋糖我得到這個錯誤:

E/AndroidRuntime: FATAL EXCEPTION: main 
       PID: 15471 
       android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.plen.myapp/files/Pictures/IMG_20161214_1516561294620205.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:832) 
        at android.content.Intent.prepareToLeaveProcess(Intent.java:8925) 
        at android.content.Intent.prepareToLeaveProcess(Intent.java:8910) 
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1519) 
        at android.app.Activity.startActivityForResult(Activity.java:4224) 
        at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48) 
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:77) 
        at android.support.v4.app.ActivityCompatJB.startActivityForResult(ActivityCompatJB.java:26) 
        at android.support.v4.app.ActivityCompat.startActivityForResult(ActivityCompat.java:146) 
        at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:937) 
        at android.support.v4.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:1046) 
        at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:956) 
        at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:945) 
        at com.plen.myapp.MyAircrafts.AddAircraftFirstPartFragment.openCamera(AddAircraftFirstPartFragment.java:263) 
        at com.plen.myapp.MyAircrafts.AddAircraftFirstPartFragment.askReadStorage(AddAircraftFirstPartFragment.java:338) 
        at com.plen.myapp.MyAircrafts.AddAircraftFirstPartFragment.askWriteStorage(AddAircraftFirstPartFragment.java:355) 
        at com.plen.myapp.MyAircrafts.AddAircraftFirstPartFragment.loadNewPhoto(AddAircraftFirstPartFragment.java:159) 
        at com.plen.myapp.MyAircrafts.AddAircraftFirstPartFragment.access$000(AddAircraftFirstPartFragment.java:48) 
        at com.plen.myapp.MyAircrafts.AddAircraftFirstPartFragment$1.onClick(AddAircraftFirstPartFragment.java:75) 
        at android.view.View.performClick(View.java:5609) 
        at android.view.View$PerformClick.run(View.java:22266) 
        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:6077) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

我怎麼能解決這個問題?我已經搜索瞭解決方案,但沒有人工作。

感謝

+1

https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed(另請參閱此示例項目:https://github.com/ commonsguy/CW-綜合/樹/主/相機/ FileProvider) – CommonsWare

+0

@CommonsWare,但如果我用這個它的工作原理也與果凍豆?或者我需要爲以前版本的Android使用其他代碼? – ste9206

+0

「但如果我用這個它的工作原理也與果凍豆?」 - 如果「this」是「FileProvider」,則問題不是Android操作系統版本,而是用戶的相機應用程序是否支持「內容」作爲「EXTRA_OUTPUT」中的「Uri」的方案。有些人會,有些人不會。如果「this」是「StrictMode」方法,那麼AFAIK將會適用於Android的所有版本,因爲它會恢復「FileUriExposedException」更改並允許您再次使用'file'方案。 – CommonsWare

回答

11

而不是return Uri.fromFile(mediaFile);

return FileProvider.getUriForFile(MainActivity.this, 
    BuildConfig.APPLICATION_ID + ".provider", 
    mediaFile); 

這就要求你添加一個提供商,爲AndroidManifest

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
... 
<application 
    ... 
    <provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="${applicationId}.provider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/provider_paths"/> 
    </provider> 
</application> 

,然後創建一個provider_paths.xml文件r下的xml文件夾es文件夾。

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="external_files" path="."/> 
</paths> 

瞭解更多:Full article

+1

這是解決方案,謝謝;) – ste9206

2

可以按以下步驟進行簡單。 把這兩條線在你的活動的onCreate。

StrictMode.VmPolicy.Builder newbuilder = new StrictMode.VmPolicy.Builder(); 
StrictMode.setVmPolicy(newbuilder.build()); 

URI曝光將VM 忽視我解決我的問題,所以。

+0

這似乎是關閉了很多東西 – TheRealChx101

+0

它將工作完美無瑕。我沒有得到任何新的錯誤或與此代碼故障。 – deva11

+0

是的,你是對的。有用。它看起來像是安裝未配置的策略對象。但是,它的工作原理 – TheRealChx101