Не удается получить доступ к сохраненным файлам в общей папке в Android (MTP)

Я хочу сохранить простой файл .txt в Android, а позже я хочу скопировать этот файл с устройства на ПК, где устройство смонтировано как MTP-устройство.

У меня есть два Android-устройства:

  • Nexus 4, стандартный Android 5.0.1
  • Nexus 7 2012, CyanogenMod 12, Android 5.0.2

Чтобы убедиться, что это не ошибка устройства Nexus, я попробовал телефон Wiko у друга.

Я использую этот код для сохранения файла в папку «Загрузки» на внешнем хранилище. Это рекомендуется на странице разработчика.

private void saveData()
    {    
        String fileName = "test.txt";
        String writeString = "Hello World";
        File filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        File saveFile = new File(filePath, fileName);
        saveFile.setReadable(true);

        try
        {
            boolean result = saveFile.createNewFile();
            if(result == true)
            {
                Log.i(TAG, "File successfully created");
            }
            else
            {
                Log.i(TAG, "Error. File not created");
            }
            BufferedWriter writer = new BufferedWriter(new FileWriter(saveFile));
            writer.write(writeString);
            writer.close();
        }
        catch(Exception e)
        {
            Log.e(TAG,e.toString());
        }
    }

Я использую следующие разрешения:

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

Когда я использую MTP для подключения к устройству, я получаю пустую папку для загрузки, но когда я получаю доступ к папке через файловый браузер в Android (в моем случае это файловый браузер ES), я вижу файл и содержимое. Поэтому я думаю, что создание файла и запись в него работают.

При создании файла получаю правильный Журнал: "Файл успешно создан".


person DarkRettich    schedule 29.04.2015    source источник
comment
MTP полагается на то, что MediaStore знает файл. Вы должны вызвать MediaScanner для только что созданного файла. stackoverflow.com/questions/14449509/ Выключение/включение вашего устройства также поможет. Пожалуйста, укажите MTP в теме вашего сообщения.   -  person greenapps    schedule 29.04.2015
comment
спасибо greenapps, это сработало для меня.   -  person DarkRettich    schedule 01.05.2015


Ответы (1)


Вам нужно добавить файл в MediaStore: (довольно много кода...)

try {
    new MediaScannerConnectionClient() {
        private MediaScannerConnection mMs;

        public void init() {
            mMs = new MediaScannerConnection(myContext, this);
            mMs.connect();
        }

        @Override
        public void onMediaScannerConnected() {

            File pathFile = Environment
                   .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
            File scanFile = new File(pathFile, "test.txt");

            mMs.scanFile(scanFile.getAbsolutePath(), null); // <-- repeat for all files

            mMs.disconnect();
        }

        @Override
        public void onScanCompleted(String path, Uri uri) {
        }

    }.init();
} catch(Exception e) {
    // Device does not support adding files manually. 
    // Sending Broadcast to start MediaScanner (slower than adding manually)
    try {   
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
                Uri.parse("file://" + Environment.getExternalStorageDirectory())));
    } catch(Exception ee) {
        // Something went terribly wrong. 
        // Can't add file to MediaStore and can't send Broadcast to start MediaScanner.
    }
}
person ByteHamster    schedule 29.04.2015
comment
Если вы нашли решение, было бы очень признательно и полезно для других, если бы вы опубликовали ответ самостоятельно и отметили его как принятое. :) - person ocramot; 07.05.2015