Android: файлы, которые я пишу на SD-карте, не отображаются в Windows Explorer, для Acer Iconiatab

В моем приложении я создаю файлы и записываю их на Sdcard. Мои созданные файлы отображаются правильно в DDMS и в проводнике Windows, когда я монтирую Samsung Galaxy в качестве устройства USB. Но они не отображаются в Windows Explorer на моем Acer Iconia Tab A500, когда он подключен USB. Я предполагаю, что это связано с некоторой разницей в 3.0? Нужно ли мне создавать файлы по-разному в версии 3.0, чтобы они отображались в Windows с помощью usb?

Ответ 1

Отправка этого намерения после написания файла решила проблему. Кредит отправляется в Commons Guy, он предоставил ответ на другом форуме.

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
            + Environment.getExternalStorageDirectory()))); 

Редактировать: Commons Guy прокомментировал, что отправка фальшивого намерения (например, выше), вероятно, является плохой идеей, поэтому я использовал это вместо:

   //called after writing file, from my activity 
    new SingleMediaScanner(this, path); 

    private class SingleMediaScanner implements MediaScannerConnectionClient 
    { 
            private MediaScannerConnection mMs; 
            private String path; 
            SingleMediaScanner(Context context, String f) 
            { 
                mPath = f; 
                mMs = new MediaScannerConnection(context, this); 
                mMs.connect(); 
            } 
            @Override 
            public void onMediaScannerConnected() 
            { 
                mMs.scanFile(mFile, null); 
            } 
            @Override 
            public void onScanCompleted(String path, Uri uri) 
            { 
                mMs.disconnect(); 
            } 
        }

Ответ 2

На моей вкладке Acer Iconia getExternalStorageDirectory фактически указывает на внутреннее хранилище (считается "общим", в отличие от внутреннего хранилища "private") и монтируется как /mnt/sdcard. Существует альтернативное (и "истинное" ) внешнее хранилище, которое идет на SD-карте в /mnt/external _sd. Я не уверен, есть ли в настоящее время идеальный способ получить этот путь. Вы знаете, какой раздел монтируется при подключении вкладки Iconia USB?

Ответ 3

Также найдена эта проблема на Nexus 7. Если устройство подключается к компьютеру с помощью MTP (предпочтительный протокол сотовой связи USB), при создании файла сканер носителей необходимо обновить, чтобы он сразу отображался в проводнике Windows.

Некоторые устройства автоматически обновляют медиа-сканер (Samsung S4), некоторые - нет (Nexus 7). После создания нового файла на SD-карте, чтобы обновить медиа-сканер, выполните следующий вызов.

File file= new File(FullPathAndFileNameToYourNewFile);
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file));
sendBroadcast(intent);

Вот действительно хороший пост на эту тему. Благодарим автора за объяснение и код выше. https://www.grokkingandroid.com/adding-files-to-androids-media-library-using-the-mediascanner/

Ответ 4

пример создания файла sdcard для чтения и записи.

public class ReadWriteSDCardFile extends Activity {

private static final String LOGTAG = "FileStorage";

private TextView readOutput;

@Override
public void onCreate(final Bundle icicle) {
    super.onCreate(icicle);
    this.setContentView(R.layout.read_write_sdcard_file);

    this.readOutput = (TextView) findViewById(R.id.readwritesd_output);

    String fileName = "testfile-" + System.currentTimeMillis() + ".txt";

    // create structure /sdcard/unlocking_android and then WRITE
    File sdDir = new File("/sdcard/");
    if (sdDir.exists() && sdDir.canWrite()) {
        File uadDir = new File(sdDir.getAbsolutePath() + "/unlocking_android");
        uadDir.mkdir();
        if (uadDir.exists() && uadDir.canWrite()) {
            File file = new File(uadDir.getAbsolutePath() + "/" + fileName);
            try {
                file.createNewFile();
            } catch (IOException e) {
                Log.e(ReadWriteSDCardFile.LOGTAG, "error creating file", e);
            }

            // now that we have the structure we want, write to the file
            if (file.exists() && file.canWrite()) {
                FileOutputStream fos = null;
                try {
                    fos = new FileOutputStream(file);
                    fos.write("I fear you speak upon the rack, where men enforced do speak anything.".getBytes());
                } catch (FileNotFoundException e) {
                    Log.e(ReadWriteSDCardFile.LOGTAG, "ERROR", e);
                } catch (IOException e) {
                    Log.e(ReadWriteSDCardFile.LOGTAG, "ERROR", e);
                } finally {
                    if (fos != null) {
                        try {
                            fos.flush();
                            fos.close();
                        } catch (IOException e) {
                            // swallow
                        }
                    }
                }
            } else {
                Log.e(ReadWriteSDCardFile.LOGTAG, "error writing to file");
            }

        } else {
            Log.e(ReadWriteSDCardFile.LOGTAG, "ERROR, unable to write to /sdcard/unlocking_android");
        }
    } else {
        Log
            .e(
                ReadWriteSDCardFile.LOGTAG,
                "ERROR, /sdcard path not available "
                    + "(did you create an SD image with the mksdcard tool, and start emulator with -sdcard <path_to_file> option?");
    }

    // READ
    File rFile = new File("/sdcard/unlocking_android/" + fileName);
    if (rFile.exists() && rFile.canRead()) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(rFile);
            byte[] reader = new byte[fis.available()];
            while (fis.read(reader) != -1) {
            }
            this.readOutput.setText(new String(reader));
        } catch (IOException e) {
            Log.e(ReadWriteSDCardFile.LOGTAG, e.getMessage(), e);
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    // swallow
                }
            }
        }
    } else {
        this.readOutput.setText("Unable to read/write sdcard file, see logcat output");
    }
}

}

Ответ 5

Как вы определяете местоположение SD-карты?

Похоже, вы считаете, что SD-карта всегда установлена ​​на /mnt/sdcard. Вы должны абсолютно никогда не кодировать пути в Android, так как каждая реализация может монтировать SD-карту в другом месте. Скорее, вы должны использовать getExternalStorageDirectory(), чтобы определить, где установлена ​​карта SD, и построить свой путь из этого.

Ответ 6

Думаю, что я опубликую новый ответ, потому что текущий принятый ответ не работает ни на чем после KitKat.

File imageFile = ....

MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);

Решение предоставлено darrenp здесь.