Android 6.0上的USB OTG针对API 22或更低版本

时间:2016-01-18 12:33:41

标签: android intellij-idea android-6.0-marshmallow usb-drive usb-otg

我正在 Intellij IDEA 14.1.6 下开发文件管理器,我必须支持USB OTG闪存驱动器。我的文件管理器可以在API<设备上使用USB OTG。 23(棉花糖)。我在声明(123)中看到了多个引用:

  

...在您选择在应用程序中定位版本23之前,它不需要完全支持。如果您的目标是22或更低版本,您的应用程序将在安装时请求所有权限,就像在Marshmallow下运行操作系统的任何设备上一样。

我的项目有目标:

 <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="22"/>

但Nexus 5(升级到Android 6.0.1)无法看到USB OTG闪存驱动器,与其他一些具有API 19,21,22的设备不同,它们可以非常容易地读写闪存驱动器。

问题是:是否有人检查过此声明? 此声明是仅适用于API 23还是仅适用于预览版(M)? 此声明仅适用于 Android Studio 吗?

编辑:使用Marshmallow将Nexus 5作为以前的API级设备使用USB OTG的唯一方法是使用命令:

adb shell sm set-force-adoptable true

来自终端。

1 个答案:

答案 0 :(得分:0)

在Android 6.0+中,用户需要授予应用程序的存储访问权限,否则应用程序无法访问内部或外部存储。

您可以在应用的MainActivity onCreate(Bundle savedInstanceState)方法中执行此操作:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    checkForPermissionsGrantStatus();

比:

private void checkForPermissionsGrantStatus() {
    int storagePermissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if(storagePermissionCheck == PackageManager.PERMISSION_DENIED)
        requestForPermissionAccess(Manifest.permission.WRITE_EXTERNAL_STORAGE, 1);
}

private void requestForPermissionAccess(String permission, int requestCode) {
    ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode);
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
        Toast.makeText(this, "Storage Permission Granted", Toast.LENGTH_SHORT).show();
    }
}

每次运行时,您的应用程序都会检查设备是否运行Android 6.0+。如果确实如此,它将检查它是否具有存储许可权。如果是,它将停止在那里显示一个弹出窗口,要求用户授予存储访问权。

截图: Screenshot showing Storage Permission Request Popup