簡體   English   中英

打開失敗:第一次運行時EACCES(權限被拒絕)

[英]open failed: EACCES (Permission denied) on first run

請求運行時的所有權限后,我試圖將文件寫入/讀取到外部存儲中。

表現:

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

運行:

Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE.

JavaCode:

    public class FilesUtil {

    public static String saveImageToFile(Bitmap image ,String employeeId){
        String root = Environment.getExternalStorageDirectory().toString();
        File myDir = new File(root + "/AppName");
        myDir.mkdirs();
        String filename = String.format("EMPLOYEE_%s.png", employeeId);
        File file = new File (myDir, filename);
        if (file.exists()){
            file.delete(); // here i'm checking if file exists and if yes then i'm deleting it but its not working
        }

        FileOutputStream out = null;
        try {
            out = new FileOutputStream(file,false);
            image.compress(Bitmap.CompressFormat.PNG, 100, out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return filename;
    }

    public static String getImagePath(String employeeId){
        String result  = Environment.getExternalStorageDirectory().toString() + "/AppName/";
        String filename = String.format("EMPLOYEE_%s.png", employeeId);
        return result + filename;
    }
}

加載文件:

private Bitmap getCurrentPhoto() {
    File image = new File(FilesUtil.getImagePath(getCurrentEmployeeId()));
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(), bmOptions);
    return bitmap;
}

我第一次運行該應用程序時,打開失敗:僅在Android 6.0.1上運行EACCES(權限被拒絕),但是,在其他版本的Operative系統中,該功能運行正常。 如果我在6.0.1上殺死並重新打開了該應用程序,則該功能運行正常。

Android 6.0上存在一個錯誤,直到所有應用程序進程都被殺死,該權限才被應用。 在其他版本的操作系統中,如果權限設置發生更改,則該應用程序將自動終止,並從上一個活動重新啟動。

我避免在onRequestPermissionsResult上使用此錯誤並重新啟動應用程序。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (grantResults.length == permissions.length){
        if (android.os.Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage(R.string.restart_message)
                    .setPositiveButton(R.string.restart_button, (dialog, id) -> {
                        restartApp();
                    });
            builder.create().show();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM