В моем приложении я создаю файлы и записываю их на Sdcard. Мои созданные файлы отображаются правильно в DDMS и в проводнике Windows, когда я монтирую Samsung Galaxy в качестве устройства USB. Но они не отображаются в Windows Explorer на моем Acer Iconia Tab A500, когда он подключен USB. Я предполагаю, что это связано с некоторой разницей в 3.0? Нужно ли мне создавать файлы по-разному в версии 3.0, чтобы они отображались в Windows с помощью usb?
Android: файлы, которые я пишу на SD-карте, не отображаются в Windows Explorer, для Acer Iconiatab
Ответ 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 здесь.