Приложение вылетает при чтении файлов из хранилища в noughat
Выпуск:
Код предназначен для выбора файла из внешнего хранилища для выполнения OTA-обновления из Android-приложения. Это хорошо работает в Kitkat, но когда дело доходит до телефонов Nougat (Moto G4) при выборе приложения Path, происходит сбой.
Я попытался отладки, проблема с этой строкой file = new File(item.getFilePath());
это создает NullPointerException
в версии Nougat я также пытался дать разрешение в Manifest для чтения из внешнего хранилища, но проблема все еще остается. В чем может быть проблема? Я разместил код ниже. Пожалуйста, помогите
public class ChooseImageFileDialog extends Activity {
private FileListAdapter mAdaptor;
private ArrayList<FileFolderItem> mFileFolderList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mChooseButton = (Button) findViewById(R.id.select_button);
mChooseButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mSelectedFile != null) {
getIntent().putExtra(RETURN_PATH_RESULT,
mSelectedFile.getPath());
setResult(RESULT_OK, getIntent());
finish();
}
}
});
mFileFolderList = new ArrayList<FileFolderItem>();
mAdaptor = new FileListAdapter(this, mFileFolderList);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> listview, View view, int
position, long id) {
FileFolderItem item = mFileFolderList.get(position);
if (item == null)
return;
File file = new File(item.getFilePath());
highlightSelectedItem(listview, view);
}
});
Модификация:27/11/2017
mChooseButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mSelectedFile != null) {
if (Build.VERSION.SDK_INT >= 23) {
if (checkPermission()) {
Log.e("value", "Permission already Granted, Now you
can save image.");
}
else {
requestPermission();
}
}else {
Log.e("value", "Not required for requesting runtime
permission");
getIntent().putExtra(RETURN_PATH_RESULT,
mSelectedFile.getPath());
setResult(RESULT_OK, getIntent());
finish();
}
}
}
});
private boolean checkPermission() {
int result =
ActivityCompat.checkSelfPermission(ChooseImageFileDialog.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (result == PackageManager.PERMISSION_GRANTED) {
return true;
}else{
return false;
}
}
private void requestPermission()
{
if(ActivityCompat.
shouldShowRequestPermissionRationale(ChooseImageFileDialog.th
is,Manifest.permission.WRITE_EXTERNAL_STORAGE))
{
Toast.makeText(ChooseImageFileDialog.this, "Write External Storage
permission allows us to do store images. Please allow this
permission in App Setting", Toast.LENGTH_LONG).show();
}
else
{
ActivityCompat.requestPermissions(ChooseImageFileDialog.this, new
String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
PERMISSION_REQUEST_CODE);
}
}
Я изменил код, чтобы получить разрешения во время выполнения, но приложение по-прежнему не работает.
1 ответ
Вы должны запросить разрешение во время выполнения для устройств выше Android 5.1.
Так что вам нужно попросить WRITE_EXTERNAL_STORAGE
разрешение:)
Прочитайте следующую документацию:
https://developer.android.com/training/permissions/requesting.html