Как можно прочитать файл, используя систему разрешений Scoped Directory Access? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь получить доступ к своей SD-карте на Android 7.0 (Samsung S7) и обнаружил, что это возможный способ получить разрешение на это: https://developer.android.com/training/articles/scoped-directory-access

Я написал следующий код

public class MainActivity extends AppCompatActivity {

    Intent sdCardIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
        StorageVolume sdCARD = null;
        for (StorageVolume volume : sm.getStorageVolumes()) {
            if (volume.getDescription(this.getApplicationContext()).equals("SD card")) {
                sdCARD = volume;
            }
        }
        if (sdCARD == null) {
            return;
        }
        sdCardIntent = sdCARD.createAccessIntent(null);
        startActivityForResult(sdCardIntent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Access sd card?
    }
}

При запуске я получаю приглашение с разрешением, и оно, кажется, работает, так как я получаю событие в onActivityResult, но я не нашел, как получить доступ к какому-либо файлу или каталогу на SD-карте.

Должен ли я использовать URI, полученный из результата Intent?

1 Ответ

0 голосов
/ 01 мая 2018

Должен ли я использовать URI, полученный из результата Intent?

Да. Это Uri должно представлять дерево документов, и поэтому вы можете использовать DocumentFile.fromTreeUri(), чтобы получить DocumentFile для этого дерева. Оттуда вы можете перебирать содержимое и получать Uri объектов для отдельных частей содержимого. Используйте ContentResolver и метод openInputStream() для чтения любого такого фрагмента контента.

Тем не менее:

  • Пожалуйста, сделайте ввод / вывод в фоновых потоках

  • Если вы хотите передать Uri другому компоненту (например, мероприятию, услуге), даже в вашем собственном приложении, обязательно включите FLAG_GRANT_READ_URI_PERMISSION и / или FLAG_GRANT_WRITE_URI_PERMISSION в Intent

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...