2015-02-27 4 views
2

Я искал множество тем, посвященных написанию файлов в Android, но большинство из них хотели записать файлы на внутреннюю память Android. Другие, кто хотел написать файлы на внешней SD-карте, не имели успеха. Мой случай очень похож, но я думаю, что запись файлов на внешний USB - это совершенно другой случай.Android записывает файлы на USB через кабель OTG

Я использую Samsung Galaxy Note II работающий товар TouchWiz 4.4.2 [не укоренился]. Мой телефон поддерживает micro-USB-OTG, и я могу подключить свой USB как rwxrwx-x без укоренения. Полный путь моего USB - это/storage/UsbDriveA.

Я попытался использовать Environment.getExternalStorageDirectory(), чтобы получить путь или использовать путь (упомянутый выше) напрямую, но ни один из них не удался. Первый возвращает внутренний путь хранения, а второй возвращает ошибку с «разрешенным разрешением». Я уже поставил

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

в Android Manifest, поэтому я задавался вопросом, почему мой код не работал.

Кроме того, я могу написать что-нибудь на свой USB-носитель с использованием Root Browser (используйте его без root) и Simple Browser, поэтому я считаю, что есть способ сделать это.

Вот мой код:

File file = new File(path.getAbsolutePath(), "test.txt"); 
// File file = new File("/storage/extSdCard","test.txt"); 
err = false; 
    try { 
    FileOutputStream f = new FileOutputStream(file); 
    PrintWriter pw = new PrintWriter(f); 
    pw.print(get); 
    pw.flush(); 
    pw.close(); 
    f.close(); 
    }catch (Exception e) { 
    e.printStackTrace(); 
    Toast.makeText(MainActivity.this, "writing error",Toast.LENGTH_LONG).show(); 
       err = true; 
    } 
    Log.i("File Path:", file.getPath()); 

Заранее спасибо !!!

ответ

1

От https://source.android.com/devices/storage/

Начиная с Android 4.4, ...

Разрешение WRITE_EXTERNAL_STORAGE должен только предоставить доступ на запись в основное внешнее хранилище на устройстве. Приложениям не разрешается отправлять на внешние внешние устройства хранения, за исключением их каталогов, специфичных для пакета, которые разрешены с помощью синтезированных разрешений. Ограничение записи таким образом гарантирует, что система удалит файлы , когда приложения будут удалены.

Итак, начиная с Android 4.4 в устройствах с несколькими внешними хранилищами, вы сможете писать только на основном внешнем хранилище. Учтите, что внешнее хранилище не означает только «реальные внешние» устройства. Она определяется следующим образом (из External Storage reference)

Внешнее запоминающее устройство может быть обеспечено с помощью физических носителей (например, на SD-карту ), или подвергая часть внутренней памяти через слой эмуляции .

Во всяком случае, обходной путь для записи во вторичное внешнее хранилище с использованием поставщика медиаконтента. Взгляните на http://forum.xda-developers.com/showthread.php?t=2634840

Я использовал его в своем проекте, но, как говорит автор, это далеко не идеальное решение, и он не гарантированно работает на следующих версиях Android, поэтому вы не должны позволять всем ваше приложение, чтобы полагаться на это обходное решение.

+0

Я попытался использовать класс (xda), который вы упомянули выше, но ему нужен андроид.permission.WRITE_MEDIA_STORA GE, который может применяться только в системных приложениях. Я не хочу помещать приложение в/system, потому что это бессмысленно. Поэтому я хочу знать, есть ли другой способ сделать это? Во всяком случае, большое спасибо. – youngBeginnerDeveloper

3

От android 4.4 вы можете использовать Storage Access Framework для доступа к съемным носителям (см. https://commonsware.com/blog/2014/04/09/storage-situation-removable-storage.html). Например, я попытался с успехом скопировать pdf-файл из локальной памяти в сменную память, подключенную адаптером OTG. Единственное ограничение: пользователь должен выбрать папку назначения.

1) называют 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) перехватывают возвратного намерения

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

3) использовать ContentResolver, чтобы открыть OutputStream и использовать его, чтобы скопировать файл

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(); 
     } 
    } 
} 
Смежные вопросы