2017-04-05 14 views
0

私はこのコードで私のextornalストレージにおけるいくつかのドロウアブルを書くしようとしている:Androidの書き込み

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.paco); 

     File file = new File(Environment.getExternalStorageDirectory(), "paco.png"); 
     FileOutputStream outStream = null; 

     try { 
     FileOutputStream out = new FileOutputStream(file); 
     bm.compress(Bitmap.CompressFormat.PNG, 90, out); 
     out.flush(); 
     out.close(); 
      Log.d("XXXXX","voy a cerrar"); 
     } catch (Exception e) { 
      Log.e("XXXXX","eeeee", e); 
     } 

しかし、私はこのエラーを取得しておいてください。

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

私のマニフェストで3210
+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 (Environment.getExternalStorageState(file) != Environment.MEDIA_MOUNTED) { 
    // your storage is not ready for work, do something with this 
} 

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以上の場合は、(既にマニフェストファイルに存在していますが)実行時にアクセス権を要求する必要があります。

// 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

は、最初は、お使いのストレージの準備ができていることを確認し

は、このコードを試してみてください私が覚えているように、Kit-Katから外部ストレージのルートに書き込むことはできません。 ストレージ上のアプリケーション固有のフォルダに書き込むことのみが許可されています。 、このフォルダを取得directoryTypeについて

Environment.getExternalStoragePublicDirectory(directoryType); 

何を使用するには、おそらく、Environment.DIRECTORY_PICTURESを使いたい、あなたをmethod`sマニュアルを参照してください。

これを試してください。

関連する問題