Разрешение не распознано

Я занимаюсь разработкой Asus nexus 7 и записываю данные в файл. Разрешение на запись добавляется, как показано ниже в манифесте, но во время выполнения logcat отображает ошибку, говорящую о том, что требуемого разрешения нет.

ПРИМЕЧАНИЕ: тот же код работает при установке на других устройствах, но он не работает на Asus Nexus 7.

пожалуйста, дайте мне знать, как исправить эту ошибку

манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.com.bt_11" >

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".ActMain"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:configChanges="keyboardHidden|orientation|screenSize">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

** проверьте разрешение:

protected void onPreExecute() {
        super.onPreExecute();
        Log.w(TAG, CSubTag.msg("ATRx.onPreExecute"));
        ....
        ....
        ....
        this.mPerWES = Manifest.permission.WRITE_EXTERNAL_STORAGE;
        int hasWESPer = ContextCompat.checkSelfPermission(getApplicationContext(), this.mPerWES);

        if ((hasWESPer == PackageManager.PERMISSION_GRANTED)) {
            this.mLogFile = IOCtrl.createFile("Test_00.txt");
        } else {
            Log.e(TAG, CSubTag.msg("ATRx.onPreExecute", "missing Permission: " + this.mPerWES));//logcat displays this line
        }
    }

как создается файл

public static File createFile(String fileName) {
    Log.w(TAG, CSubTag.msg("createFile"));

    String state;

    if (IOCtrl.isExternalStorageMounted()) {
        //Log.v(TAG, CSubTag.subBullet("createFile", "MEDIA_MOUNTED_READ_ONLY"));

        File dir = new File(IOCtrl.ROOT_DIR + File.separator + IOCtrl.DIR_NAME);
        boolean dirCreated = dir.mkdirs();

        if (dirCreated) {
            Log.d(TAG, "dir: " + dir.getAbsolutePath() + " created");
        } else {
            Log.d(TAG, "dir: " + dir.getAbsolutePath() + " already exists");
        }

        File file = new File(dir, fileName);
        boolean fileExists = file.exists();

        if (fileExists) {
            Log.d(TAG, "file: " + fileName + " already exists");
        } else {
            Log.d(TAG, "file: " + fileName + " will be created");
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
                Log.e(TAG, CSubTag.subBullet("createFile", "Error creating file: " + e.getMessage()));
                return null;
            }
        }

        return file;
    } else {
        Log.e(TAG, CSubTag.msg("createFile", "media storage is not available"));
        return null;
    }

}

*Обновить

**logcat**:

11-27 10:05:42.564 16376-16376/com.example.com.bt_11 W/IOCtrl: +++++ isExternalStorageMounted() +++++
11-27 10:05:42.573 16376-16376/com.example.com.bt_11 D/IOCtrl: isExternalStorageMounted(): -> media state: mounted
11-27 10:05:42.573 16376-16376/com.example.com.bt_11 D/IOCtrl: dir: /storage/emulated/0/CAN_BUS already exists
11-27 10:05:42.574 16376-16376/com.example.com.bt_11 D/IOCtrl: file: Test_00.txt will be created
11-27 10:05:42.574 16376-16376/com.example.com.bt_11 W/System.err: java.io.IOException: open failed: EACCES (Permission denied)
11-27 10:05:42.574 16376-16376/com.example.com.bt_11 W/System.err:     at java.io.File.createNewFile(File.java:939)
11-27 10:05:42.574 16376-16376/com.example.com.bt_11 W/System.err:     at com.example.com.bt_11.IOCtrl.createFile(IOCtrl.java:87)
11-27 10:05:42.574 16376-16376/com.example.com.bt_11 W/System.err:     at com.example.com.bt_11.ActConnect2$ATRx.onPreExecute(ActConnect2.java:856)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:604)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at com.example.com.bt_11.ActConnect2$ATConnect.onPostExecute(ActConnect2.java:705)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at com.example.com.bt_11.ActConnect2$ATConnect.onPostExecute(ActConnect2.java:577)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at android.os.AsyncTask.finish(AsyncTask.java:651)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at android.os.AsyncTask.-wrap1(AsyncTask.java)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at android.os.Looper.loop(Looper.java:148)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at libcore.io.Posix.open(Native Method)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:     at java.io.File.createNewFile(File.java:932)
11-27 10:05:42.575 16376-16376/com.example.com.bt_11 W/System.err:  ... 14 more
11-27 10:05:42.576 16376-16376/com.example.com.bt_11 E/IOCtrl: <<createFile>>:  Error creating file: open failed: EACCES (Permission denied)

2 ответа

Начиная с уровня API 23 пользователи предоставляют разрешения приложениям во время работы приложения, а не при установке приложения. У вас есть два решения вашей проблемы. Самый быстрый способ - уменьшить targetApi до 22, а второй - запросить разрешения во время выполнения, как показано в следующем примере.

if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)==PackageManager.PERMISSION_GRANTED) {
   //do the things} 
else {
    requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },AnyNumber);
}

Проверить эту ссылку из Android документов. http://developer.android.com/training/permissions/requesting.html
По сути, когда пользователь одобряет запрос, вы должны определить обратный вызов onRequestPermissionsResult() в своей активности и проверить, предоставлено ли разрешение / отказано. Из вашего кода не ясно, где это находится в вашем коде.

Другие вопросы по тегам