2015-09-25 2 views
3

Когда я объявляю только READ_EXTERNAL_PERMISSION в своем манифесте, getExternalFilesDir() возвращает null. Если я объявляю WRITE_EXTERNAL_STORAGE, getExternalFilesDir() что-то возвращает.getExternalFilesDir (null) возвращает null даже с разрешением READ_EXTERNAL_STORAGE

Я сделал чек, чтобы узнать, действительно ли у меня есть разрешение и проверено, установлено ли внешнее хранилище.

PackageManager pm = mContext.getPackageManager(); 
int permRead = pm.checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, mContext.getPackageName()); 
//permRead: "0" 
int permWrite = pm.checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, mContext.getPackageName()); 
//permWrite: "-1" 
String extState = Environment.getExternalStorageState(); 
// extState: "mounted" 

if (permRead == PackageManager.PERMISSION_GRANTED 
    && extState.equals(Environment.MEDIA_MOUNTED)) 
{ 
    File dir = mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
    // dir is null here!! 
    ... more work... 
} 

Как я понимаю, мне нужно только READ_EXTERNAL_STORAGE, чтобы получить что-то из getExternalFilesDir().

Что может быть причиной?

PS. Мое тестовое устройство - LG Optimus Pro G с Android 4.1.2, и я перезагрузил устройство.

ответ

1

попробуйте это, для открытого внешнего хранения.

String m_str = Environment.getExternalStorageDirectory() 
       .getAbsolutePath().toString(); 
+0

Наконец-то результат! Environment.getExternalStorageDirectory() возвращает «storage/sdcard0». Но почему getExternalFilesDir() терпит неудачу? Там все еще нет объяснений ... – wooohoh

+0

в этом вы можете дать полный путь с filename.ext –

+0

то работа я думаю –

1

Это примечание от documentation:

Возвращает нулевое значение, если внешний накопитель не подключен в данный момент, так что не может гарантировать, что путь существует;

Вы можете использовать Environment.getExternalStorageState, чтобы проверить его состояние.

Одна из распространенных ситуаций, когда внешнее хранилище недоступно/смонтировано для приложений, - это когда устройство подключено через USB к компьютеру. Внешнее хранилище становится недоступным для устройства, когда оно установлено на компьютере.

+0

Я добавил строку для вызова Environment.getExternalStorageState(), и я получил «смонтирован». Но getExternalFileDir() по-прежнему возвращает null. – wooohoh

+0

Дело в том, что если я объявляю WRITE_EXTERNAL_STORAGE в манифесте, getExternalFileDir() что-то возвращает. Если я только объявляю READ_EXTERNAL_STORAGE, getExternalFileDir() возвращает null. – wooohoh

-1

Это связано с тем, что в документах указано, что любое приложение, объявляющее разрешение WRITE_EXTERNAL_STORAGE, неявно получает разрешение на чтение.

+1

Я знаю, что WRITE_EXTERNAL предоставляет READ_EXTERNAL. Ситуация в том, что getExternalFileDir() должен возвращать что-то с READ_EXTERNAL, но это не так. Он только возвращает что-то, когда у меня есть WRITE. – wooohoh

+0

Что я говорю вам, вы должны дать разрешение WRITE слишком – KishuDroid

+1

[doc] (http://developer.android.com/reference/android/content/Context.html#getExternalFilesDir (java.lang.String)) говорит «Для доступа к путям, принадлежащим другим пакетам, требуются WRITE_EXTERNAL_STORAGE и/или READ_EXTERNAL_STORAGE.» _ Похоже, что READ достаточно. – wooohoh

Смежные вопросы