Вопрос запроса разрешения Android read_external_storage

#android

#Android

Вопрос:

 public class MainActivity extends AppCompatActivity {
    private ArrayList[] getFileList() {
        ArrayList[] arr = new ArrayList[2];
        ArrayList<String> files = new ArrayList<>();
        ArrayList<String> infor = new ArrayList<>();

        String sdcard_path = Environment.getExternalStorageDirectory().getAbsolutePath();

        Log.d("TAG", sdcard_path);
        File target_dic = new File(sdcard_path);
        File[] target_files = target_dic.listFiles();

        if(target_files.length != 0) {
            for(File file : target_files) {
                files.add(file.getName());
                infor.add(file.length()   "B");
            }
        }

        arr[0] = files;
        arr[1] = infor;

        return arr;
    }

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    private void setRecyclerView(ArrayList<String> list, ArrayList<String> list2) {
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        RecyclerAdapter recyclerAdapter = new RecyclerAdapter(list, list2, getDeviceWidth(), MainActivity.this);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(recyclerAdapter);
    }

            @Override
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        initMenuButton();
        setupPermission();
    }

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    private void setupPermission() {
        int chk = checkCallingOrSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (chk == PackageManager.PERMISSION_DENIED) {
                ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE }, 0);
                return;
            }
        }

        if(chk == PackageManager.PERMISSION_GRANTED) {
            ArrayList[] arr = getFileList();
            setRecyclerView(arr[0], arr[1]);
        }

        return;
    }

    @Override
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        Log.d("TAG", "권한결과 체크함수 호출됨.");

        if(requestCode == 0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            ArrayList[] arr = getFileList();
            setRecyclerView(arr[0], arr[1]);

        } else {
            Toast.makeText(this, "권한을 설정해주세요.", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
} 

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

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest> 

По порядку это файлы Java и файлы манифеста.
Приложение, которое я создаю, — это приложение для потоковой передачи песен, и я пытался сначала перенести файлы и папки на sdcard. Однако функция .listFiles() продолжала возвращать значение null, и я понял, что это проблема с разрешением, и написал функцию, которая запрашивает разрешение, называемое setupPermission . Однако после того, как в начале появляется окно запроса разрешения, оно работает нормально после его разрешения, но сначала запуск приложения, предоставление разрешения, а затем запуск его со второго раза не работает должным образом. Если у меня уже есть разрешение read_external_storage, я просто загружаю список, но он не работает. В эмуляторе только файлы, которые существовали, когда разрешение было предоставлено в начале, были загружены правильно, а файлы, добавленные впоследствии, не могли быть восстановлены, а на мобильных телефонах по-прежнему возникает ошибка, которая возвращает значение null из listFiles() . Как я могу это исправить?

Комментарии:

1. Устройство Android 10?

2. Пожалуйста, удалите большую часть вашего кода. Почему вы должны беспокоить нас с помощью recyclerview, адаптера или цвета ваших кнопок?

3. Мне очень жаль. Ненужный код Java и код xml были удалены.

4. Резюмируя проблему еще раз, при первом запуске приложения и разрешении разрешения на чтение файлов списки файлов отображаются нормально, но когда вы запускаете приложение после этого, список файлов не отображается нормально, и функция .listFiles() возвращает null .

5. После этого, даже если я запускаю приложение, разрешение не исчезает и применяется как есть, поэтому последний if(chk == PackageManager. PERMISSION_GRANTED) {часть функции setupPermission выполняется нормально, но список файлов не загружается.