2017-04-05 115 views
0

我尝试写一些可绘制在我使用此代码extornal存储的Android写外部存储

28476-28476/com.example.usuari.myapplication3 E/XXXXX: eeeee java.io.FileNotFoundException: /storage/emulated/0/paco.png: open failed: EACCES (Permission denied) at libcore.io.IoBridge.open(IoBridge.java:452) at java.io.FileOutputStream.(FileOutputStream.java:87) at java.io.FileOutputStream.(FileOutputStream.java:72) at com.example.usuari.myapplication3.MainActivity.iniciarDrawables(MainActivity.java:276) at com.example.usuari.myapplication3.MainActivity.onCreate(MainActivity.java:90) at android.app.Activity.performCreate(Activity.java:6876) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) at android.app.ActivityThread.access$1100(ActivityThread.java:222) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7229) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) at libcore.io.Posix.open(Native Method) at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) at libcore.io.IoBridge.open(IoBridge.java:438) at java.io.FileOutputStream.(FileOutputStream.java:87)  at java.io.FileOutputStream.(FileOutputStream.java:72)  at com.example.usuari.myapplication3.MainActivity.iniciarDrawables(MainActivity.java:276)  at com.example.usuari.myapplication3.MainActivity.onCreate(MainActivity.java:90)  at android.app.Activity.performCreate(Activity.java:6876)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350)  at android.app.ActivityThread.access$1100(ActivityThread.java:222)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:158)  at android.app.ActivityThread.main(ActivityThread.java:7229)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我有权限项在我的清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.usuari.myapplication3"> 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

... 

编辑:我用SDK工作23

+0

如果您的目标SDK为23或更高版本,则需要在运行时请求权限:https://developer.android.com/training/permissions/requesting.html –

+0

您正在测试什么sdk版本..? – rafsanahmad007

+0

如果您使用API​​ 23或更高版本,则必须为用户请求权限。 [查看此链接](https://developer.android.com/training/permissions/requesting.html?hl=pt-br) –

回答

1

Android Sdk> = 23需要用户的运行时权限。只有向清单添加权限才行。

试试这个代码:

if(isPermissionGranted()){ 
     //open file 
    } 
public boolean isPermissionGranted() { 
    if (Build.VERSION.SDK_INT >= 23) { 
     if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       == PackageManager.PERMISSION_GRANTED) { 
      Log.v("TAG","Permission is granted"); 
      return true; 
     } else { 

      Log.v("TAG","Permission is revoked"); 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); 
      return false; 
     } 
    } 
    else { //permission is automatically granted on sdk<23 upon installation 
     Log.v("TAG","Permission is granted"); 
     return true; 
    } 
} 

捕捞许可结果中:

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 

     case 0: { 

      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show(); 
       //call your method open file 
      } else { 
       Toast.makeText(getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show(); 
      } 
      return; 
     } 
    } 
} 
1

如果您使用API​​ 23+,则必须在RunTime请求权限(尽管它们已经存在于清单文件中)。

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE) 
     != PackageManager.PERMISSION_GRANTED) { 

    // Should we show an explanation? 
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 

     // Show an explanation to the user *asynchronously* -- don't block 
     // this thread waiting for the user's response! After the user 
     // sees the explanation, try again to request the permission. 

    } else { 

     // No explanation needed, we can request the permission. 

     ActivityCompat.requestPermissions(thisActivity, 
       new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
       MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

     // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
     // app-defined int constant. The callback method gets the 
     // result of the request. 
    } 
} 
1

首先,检查你的存储已准备就绪:

if (Environment.getExternalStorageState(file) != Environment.MEDIA_MOUNTED) { 
    // your storage is not ready for work, do something with this 
} 

其次,到目前为止,我记得,从Kit-Kat开始,你不能写入外部存储的根目录。 只允许写入存储器上的应用程序特定文件夹。 为了得到这个文件夹,使用

Environment.getExternalStoragePublicDirectory(directoryType); 

什么directoryType,检查method`s文档,你,大概,想用Environment.DIRECTORY_PICTURES。

试试这个。