Не удается получить доступ к хранилищу данных на телефоне(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();
}
}