I am developing a file manager with USB OTG flash drives support. My file manager works fine with USB OTG on devices with API < 23 (Marshmallow) and I am going to implement new Android 6.0 runtime permissions with a code below:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
checkForPermissionGrantStatus();
if (!Settings.System.canWrite(this))
askWriteSettingsPermission();
}
...
}
@TargetApi(Build.VERSION_CODES.M)
private void askWriteSettingsPermission(){
new AlertDialog.Builder(this)
.setMessage(R.string.write_settings_permission)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
}).show();
}
private void checkForPermissionGrantStatus() {
String[] dangerousPermissionsArray = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE};
List<String> notIssuedPermissions = new ArrayList<>();
for (String permission : dangerousPermissionsArray) {
if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_DENIED)
notIssuedPermissions.add(permission);
}
if (notIssuedPermissions.size() > 0)
ActivityCompat.requestPermissions(this, notIssuedPermissions.toArray(new String[notIssuedPermissions.size()]), 95);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 95:
for (int grantResult : grantResults)
if (grantResult != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Not all permissions obtained.", Toast.LENGTH_SHORT).show();
return;
}
Toast.makeText(this, "All permissions obtained.", Toast.LENGTH_SHORT).show();
break;
}
}
My project has target
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="23"/>
and it is the only change I have made in Manifest.xml in comparison with previous application version, which works fine with USB OTG on devices with API < 23.
I am accepting two system dialogs and one AlertDialog which appear after application starts, but my USB OTG flash drive is still unreadable. The question is: Do I need to implement some additional steps to force USB OTG flash drive be readable under Android 6.0.1 on Nexus 5 device?
P.S. I do not use Android Studio and Gradle - is it crusial?