Android write files to USB via OTG cable

后端 未结 2 358
闹比i
闹比i 2020-12-17 06:22

I\'ve been searching for many topics about android file writing, yet most of them wanted to write files to android internal storage. Others who wanted to write files on exte

相关标签:
2条回答
  • 2020-12-17 07:08

    From https://source.android.com/devices/storage/

    Starting in Android 4.4, ...

    The WRITE_EXTERNAL_STORAGE permission must only grant write access to the primary external storage on a device. Apps must not be allowed to write to secondary external storage devices, except in their package-specific directories as allowed by synthesized permissions. Restricting writes in this way ensures the system can clean up files when applications are uninstalled.

    So, starting from Android 4.4 in devices with multiple external storages you will be able to write only on the primary external storage. Take into account that External Storage does not mean only "real external" devices. It is defined as follows (from the External Storage reference)

    External storage can be provided by physical media (such as an SD card), or by exposing a portion of internal storage through an emulation layer.

    Anyway there is a workaround to write to secondary external storage using the media content provider. Take a look at http://forum.xda-developers.com/showthread.php?t=2634840

    I have used it on a project of mine, but as the author says, it's far from the ideal solution, and it is not guaranteed to work on coming Android versions, so you must not let all your app to rely on this workaround.

    0 讨论(0)
  • 2020-12-17 07:17

    From android 4.4, you can use Storage Access Framework to access to removable media (see https://commonsware.com/blog/2014/04/09/storage-situation-removable-storage.html). For example, I tried with success to copy a pdf file from local memory to removable memory connected by OTG adapter. The only limitation: the user has to choose a destination folder.

    1) call Intent.ACTION_CREATE_DOCUMENT:

    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
    intent.setType("application/pdf");
    intent.putExtra(Intent.EXTRA_TITLE, file.getName());
    startActivityForResult(intent, REQUEST_CODE);
    

    2) intercept the return intent

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(requestCode == REQUEST_CODE) {
            if (resultCode != RESULT_OK) return;
            copyFile(fileToCopy, data.getData());
        }
    }
    

    3) use the ContentResolver to open the outputStream and use it to copy the file

    private void copyFile(File src, Uri destUri) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
    
        try {
            bis = new BufferedInputStream(new FileInputStream(src));
            bos = new BufferedOutputStream(getContentResolver().openOutputStream(destUri));
            byte[] buf = new byte[1024];
            bis.read(buf);
            do {
                bos.write(buf);
            } while(bis.read(buf) != -1);
        } catch (NullPointerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bis != null) bis.close();
                if (bos != null) bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题