Не удается получить доступ к хранилищу данных на телефоне(android 12), хотя в эмуляторе все работает Android Studio

В ходе моего приложение - пользователь выбирает два файла и путь к ним передается на следующую активити. Приложение работает в эмуляторе, но не на телефоне.

Если я правильно понимаю - это связано с разрешениями и обновленной политикой безопастности от андроид 10 ( read external storage -> manage external storage). На моем телефоне стоит android 12

UPD победил проблему, когда не срабатывал выбор файла через кнопку на фрагментах, но теперь FNFE - EACCES (Permission denied)

        this.fragmentW = (FileChooserFragment) fragmentManager.findFragmentById(R.id.fragment_fileChooser);
        this.fragmentB = (FileChooserFragment) fragmentManager.findFragmentById(R.id.fragment_fileChoose2r);
Intent intent = new Intent(getApplicationContext(),AllStuffActivity.class);
            intent.putExtra("wheelsFilePath",fragmentW.getPath());
            intent.putExtra("bringsFilePath",fragmentB.getPath());
            startActivity(intent);

И в AllstufActivity:

        wPath = intent.getStringExtra("wheelsFilePath");
        bPath = intent.getStringExtra("bringsFilePath");
    File w = new File(wPath);
            File b = new File(bPath);
            FileInputStream wFis = new FileInputStream(w);
            FileInputStream bFis = new FileInputStream(b);
            Workbook bWB = WorkbookFactory.create(bFis);
            Workbook wWB = WorkbookFactory.create(wFis);  

Так же код FileChooserFragment:

public class FileChooserFragment extends Fragment {

    private static final int MY_REQUEST_CODE_PERMISSION = 1000;
    private static final int MY_RESULT_CODE_FILECHOOSER = 2000;

    private Button buttonBrowse;
    public TextView editTextPath;

    private static final String LOG_TAG = "AndroidExample";

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_file_chooser, container, false);

        editTextPath = (TextView) rootView.findViewById(R.id.editText_path);
        this.buttonBrowse = (Button) rootView.findViewById(R.id.button_browse);
        this.buttonBrowse.setOnClickListener(view -> askPermissionAndBrowseFile());
        return rootView;
    }

    void setText(String text){
        editTextPath.setText(text);
    }

    private void askPermissionAndBrowseFile()  {
        // With Android Level >= 23, you have to ask the user
        // for permission to access External Storage.
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { // Level 23

            // Check if we have Call permission
            int permisson = ActivityCompat.checkSelfPermission(this.getContext(),
                    Manifest.permission.READ_EXTERNAL_STORAGE);

            if (permisson != PackageManager.PERMISSION_GRANTED) {
                // If don't have permission so prompt the user.
                this.requestPermissions(
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        MY_REQUEST_CODE_PERMISSION
                );
                return;
            }
        }
        this.doBrowseFile();
    }

    private void doBrowseFile()  {
        Intent chooseFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
        chooseFileIntent.setType("*/*");
        // Only return URIs that can be opened with ContentResolver
        chooseFileIntent.addCategory(Intent.CATEGORY_OPENABLE);

        chooseFileIntent = Intent.createChooser(chooseFileIntent, "Choose a file");
        startActivityForResult(chooseFileIntent, MY_RESULT_CODE_FILECHOOSER);
    }

    // When you have the request results
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //
        switch (requestCode) {
            case MY_REQUEST_CODE_PERMISSION: {

                // Note: If request is cancelled, the result arrays are empty.
                // Permissions granted (CALL_PHONE).
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    Log.i( LOG_TAG,"Permission granted!");
                    Toast.makeText(this.getContext(), "Permission granted!", Toast.LENGTH_SHORT).show();

                    this.doBrowseFile();
                }
                // Cancelled or denied.
                else {
                    Log.i(LOG_TAG,"Permission denied!");
                    Toast.makeText(this.getContext(), "Permission denied!", Toast.LENGTH_SHORT).show();
                }
                break;
            }
        }
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case MY_RESULT_CODE_FILECHOOSER:
                if (resultCode == Activity.RESULT_OK ) {
                    if(data != null)  {
                        Uri fileUri = data.getData();
                        Log.i(LOG_TAG, "Uri: " + fileUri);

                        String filePath = null;
                        try {
                            filePath = FileUtils.getPath(this.getContext(),fileUri);
                        } catch (Exception e) {
                            Log.e(LOG_TAG,"Error: " + e);
                            Toast.makeText(this.getContext(), "Error: " + e, Toast.LENGTH_SHORT).show();
                        }
                        this.editTextPath.setText(filePath);
                    }
                }
                break;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    public String getPath()  {
        return this.editTextPath.getText().toString();
    }
}

Ответы (0 шт):