1

私はランタイムのアクセス許可について知っていますが、これを考慮に入れましたが、それでも動作しません。私はマニフェストにこれらの行を追加しました:オープンに失敗しました:EACCES(アクセス権が拒否されました)api23?

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

これは私ののonCreate方法です:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_new); 
    if (shouldAskPermissions()) { 
     askPermissions(); 
    } 
    generateNoteOnSD(this,fileName,msg); 
    readFile(fileName); 
} 

これは

protected static boolean shouldAskPermissions() { 
    return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1); 
} 

@TargetApi(23) 
protected void askPermissions() { 
    String[] permissions = { 
      "android.permission.READ_EXTERNAL_STORAGE", 
      "android.permission.WRITE_EXTERNAL_STORAGE" 
    }; 
    /* int requestCode = 200; 
    requestPermissions(permissions, requestCode);*/ 
    // Check if we have write permission 
    int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); 

    if (permission != PackageManager.PERMISSION_GRANTED) { 
     // We don't have permission so prompt the user 
     ActivityCompat.requestPermissions(
       this, permissions, 1); 
    } 
} 

許可を尋ねると認めるのためのものであり、これらは書き込みおよび読み出し方法

public static void generateNoteOnSD(Context context, String sFileName, String sBody) { 
     try { 
      File root = new File(String.valueOf(Environment.getExternalStorageDirectory())); 
      Log.e("file path is ", String.valueOf(Environment.getExternalStorageDirectory())); 
      if (!root.exists()) { 
       root.mkdirs(); 
      } 
      File gpxfile = new File(root, sFileName); 
      String separator = System.getProperty("line.separator"); 

      FileWriter writer = new FileWriter(gpxfile.getAbsoluteFile(), true); 
      writer.append(separator); // this will add new line ; 

      //FileWriter writer = new FileWriter(gpxfile); 
      writer.append(sBody); 
      writer.flush(); 
      writer.close(); 
      Toast.makeText(context, "Saved", Toast.LENGTH_SHORT).show(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    public void readFile(String file1){ 
     //Find the directory for the SD Card using the API 
//*Don't* hardcode "/sdcard" 
     File sdcard = Environment.getExternalStorageDirectory(); 

//Get the text file 
     File file = new File(sdcard,file1); 

//Read text from file 
     StringBuilder text = new StringBuilder(); 

     try { 
      BufferedReader br = new BufferedReader(new FileReader(file)); 
      String line; 

      while ((line = br.readLine()) != null) { 
       text.append(line); 
       text.append('\n'); 
      } 
      br.close(); 
     } 
     catch (IOException e) { 
      //You'll need to add proper error handling here 
     } 

//Find the view by its id 
     Log.e("text",text.toString()); 
    } 

EDIT これは私のスタックトレースです:

W/System.err: java.io.FileNotFoundException: /storage/emulated/0/CrowdSensingData: open failed: EACCES (Permission denied) 
W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:487) 
W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:87) 
W/System.err:  at java.io.FileWriter.<init>(FileWriter.java:58) 
W/System.err:  at enis.example.com.alarmmanagertest.FileAndServerHandlingActivity.generateNoteOnSD(FileAndServerHandlingActivity.java:128) 
W/System.err:  at enis.example.com.alarmmanagertest.ActivityRecognitionService.handleDetectedActivities(ActivityRecognitionService.java:107) 
W/System.err:  at enis.example.com.alarmmanagertest.ActivityRecognitionService.onStart(ActivityRecognitionService.java:122) 
W/System.err:  at android.app.Service.onStartCommand(Service.java:459) 
W/System.err:  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3209) 
W/System.err:  at android.app.ActivityThread.-wrap17(ActivityThread.java) 
W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1586) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:111) 
W/System.err:  at android.os.Looper.loop(Looper.java:207) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5728) 
W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 
W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
W/System.err:  at libcore.io.Posix.open(Native Method) 
W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:473) 
+1

'requestPermissions()'非同期です。それが返ってくると、ユーザーはまだ許可を得ていないのに、許可を求められていません。 – CommonsWare

+0

@CommonsWare私はあなたの意見を見ていますが、私はコードを変更する方法を理解していません。私はandroid –

+0

の初心者です。この情報は、Androidアプリの開発に関する最新の書籍やコース、さらには、[ドキュメント](https://developer.android.com/training/)でカバーされています。 permissions/requesting.html)。 [このサンプルプロジェクト](https://github.com/commonsguy/cw-omnibus/tree/master/Files/FilesEditor)では、[AbstractPermissionActivity'](https://github.com/commonsguy/cw)を使用します。アクティビティの開始時に実行時のアクセス権を要求するために必要なコードを分離する-object/app/src/main/java/com/commonsware/android/fileseditor/ – CommonsWare

答えて

4

権限がまだ付与されていない場合は、すぐにそれらを必要とするメソッドを呼び出してはいけません。代わりにonRequestPermissionsResultでそれらを呼び出します。これにより、ユーザーが権限を付与するとすぐに実行されることが保証されます。

if (shouldAskPermissions()) { 
    askPermissions(); 
} else { 
    generateNoteOnSD(this,fileName,msg); 
    readFile(fileName); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case 1: { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       generateNoteOnSD(this,fileName,msg); 
       readFile(fileName); 
      } 
     } 
    } 
} 

編集: さらに、あなたのshouldAskPermissionsでContextCompat.checkSelfPermissionを含める()メソッド。

編集2: ここshouldAskPermissionsの実装は、(だ)

protected boolean shouldAskPermissions() { 
    if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) { 
     return false; 
    } 
    int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    return (permission != PackageManager.PERMISSION_GRANTED); 
} 
+0

これは問題を解決しなかったのですが、私はまだW/System.errを取得しています:原因:android.system.ErrnoException:オープンに失敗しました:EACCES(許可が拒否されました) –

+0

@futureengineerあなたの新しいshouldAskPermissions()メソッド –

+0

あなたの時間を無駄にしないようにスタックトレースをポストする前に何かを確認するだけです。 shouldAskPermissions()メソッドをどのように変更する必要がありますか?ランタイム権限が必要かどうかを確認するためにバージョンを確認するだけです。そして、あなたがaskPermissions()メソッドを意味するのであれば、それを変更する必要がありますか?返信に投稿したメソッドonRequestPermissionsResultをトリガーするパーミッションをリクエストするだけです。何か誤解していますか? –

関連する問題