単純なXMLファイルをSDカードに単純に書き込もうとしており、Nexus 4がファイルを書き込むことに気付きましたが、Windows 7を使用したMTPプロトコルでは表示できません。
コード:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CustomerQueryRqType customerQueryRequest = new CustomerQueryRqType();
Serializer serializer = new Persister();
File myFile = new File(Environment.getExternalStorageDirectory() + "/customerQueryRequest.xml");
try {
boolean created = myFile.createNewFile();
serializer.write(customerQueryRequest, myFile);
} catch (Exception e) {
e.printStackTrace();
}
}
Astro File Managerを使用して、電話機自体でファイルを確認できます。
しかし、Windowsはそれを見ません...:
adb Shell
ディレクトリの表示:
ls -l
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Alarms
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Android
drwxrwxr-x root sdcard_rw 2012-11-21 19:30 DCIM
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Download
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Movies
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Music
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Notifications
drwxrwxr-x root sdcard_rw 2012-11-19 12:06 Pictures
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Podcasts
drwxrwxr-x root sdcard_rw 2012-11-19 13:22 Ringtones
drwxrwxr-x root sdcard_rw 2012-11-19 14:33 bluetooth
-rw-rw-r-- root sdcard_rw 79 2012-12-05 22:26 customerQueryRequest.xml
drwxrwxr-x root sdcard_rw 2012-11-20 02:50 data
-rw-rw-r-- root sdcard_rw 11394 2012-11-19 13:54 eightpen_custom_gestures
drwxrwxr-x root sdcard_rw 2012-11-19 13:17 media
Nexus 4はどうなっていますか? Windowsから私のものを隠すのはなぜですか?
Android MTPを介したUSBファイルアクセス)に影響する既知の問題 のようです。MTPキャッシュは、電話機を再起動するまで古くなっています。
回避策 は次のとおりです。
または、USBをまったく使用しないでください。この問題は、ファイルにアクセスする他の方法には影響しません。たとえば、 AirDroid を試してファイルを転送します。
注:これはAndroid 5.0.2:「メディアストレージ」をクリアし、SD Rescannerを使用した後、Windows 7で開かない4Kファイルとしてフォルダーが表示されます。その唯一のソリューションポイントは、もう一度メディアストレージをクリアし、デバイスを再起動することです
ファイルを閉じた後に次のコードを使用できます
MediaScannerConnection.scanFile(this, new String[] { file.getAbsolutePath() }, null, null);
ソース: https://code.google.com/p/Android/issues/detail?id=38282
この問題に何時間も費やした後、私はこのように解決しました:
private void rescanFolder(String dest) {
// Scan files only (not folders);
File[] files = new File(dest).listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isFile();
}
});
String[] paths = new String[files.length];
for (int co=0; co< files.length; co++)
paths[co] = files[co].getAbsolutePath();
MediaScannerConnection.scanFile(activity, paths, null, null);
// and now recursively scan subfolders
files = new File(dest).listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
for (int co=0; co<files.length; co++)
rescanFolder(files[co].getAbsolutePath());
}
問題は、スキャンする必要があることですファイルのみ(フォルダーではなく)、各fubfolderについて再帰的に繰り返す
[〜#〜] edit [〜#〜]さらに、写真アルバムに写真を追加したくない場合(ただし、コンテンツのみをmtpプロトコルで表示する場合)、配置することを忘れないでください空っぽ .nomedia
ファイルを次のように再スキャンする前にフォルダーに入れます。
new File(myFolder + File.separator + ".nomedia").createNewFile();
rescanFolder(myFolder);
Xperia Zでは、以下のコードは問題なく機能しました。
String screenShotFile = "....";
activity.sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED, Uri
.fromFile(screenShotFile)));
4.4以降の使用の場合:
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(screenShotFile)));
(残念ながら、十分にテストしたかどうか覚えていません)
http://commonsware.com/blog/2013/11/06/Android-4p4-permission-regressions.html
/ storage/emulatedに注意してください。 Android 4.2では、ユーザーごとに個別の/ sdcard /など、アプリ/ユーザーごとのエミュレートされたファンキーなエミュレートが行われます。エミュレートされたsdcardの代わりに/ sdcard /示されています。
受け入れられた回答 で言及されたバグに対して見つけた最良の回避策は、Android OSから別のマシン/サーバー(Linux、MacOS、Windows)にデータをコピーすることですSSH。
オプションおよび推奨
Android device
マシン内
_rsync -avzhP --inplace --info=progress2 -e 'ssh -p 2222' 192.168.1.5:/storage/emulated/0/DCIM/Camera/ /home/username/path/to/pics/
_
SSHelper Version 8.5 Copyright 2014, P. Lutus Default password is "admin" (recommend: change it) [email protected]'s password: admin receiving incremental file list
他の提案は私にはうまくいきませんでした:
AndroidでMediaStoreを更新するにはどうすればよいですか? に提案された簡単なコードは、外部ストレージにファイルを置いた後に呼び出された場合、MediaStoreの必要な更新を行います。 Nexus 4のコンテンツは、Window 7のファイルエクスプローラーで即座に更新されます。
OneplusOneで同様の問題が発生しました:
ソフトウェアアップデート(6.0.1へ)後、コンピューター(PTPおよびMTP)への接続時にカメラの写真を見ることができませんでした。アプリのSDRescanとSDscannerはどちらも効果がありませんでした。
私の解決策は、端末または電話のファイルエクスプローラーアプリを使用して、DCIMからすべての写真を別のフォルダーにコピーすることでした。コンピューターに接続すると、コピーしたファイルを見ることができました。それらをコンピューターに移動し、カメラフォルダーをクリアしました。恒久的な解決策はありませんが、少なくとも次のバックアップを行うまでは、問題を解決しました。 = D
ディレクトリを作成し、アプリのサンプルファイルをコピーする必要がありました。多くの実験と研究を経て、次の手順は完璧に機能しました。
1)File.mkdir()を使用してディレクトリを作成しました。
2)ディレクトリ内のファイルをコピーし、各ファイルでMediaScannerを実行します。
MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, null);
3)ディレクトリでMediaScannerを実行します。
MediaScannerConnection.scanFile(context, new String[]{directory.getAbsolutePath()}, null, null);
結果:ファイルとディレクトリは、MTPを介してPCに瞬時に表示されます。
最近、私は同じ問題に直面しましたが、いくつかの追加の研究が隠しファイルの発見に役立ちました。 Googleはストレージ構造にいくつかの変更を加えたようです。これらのファイルはすべて別のフォルダーに移動されましたThis Computer\HTC One\Internal Storage\storage\emulated\0
。しかし、すべてのファイルが移動されたわけではないのは奇妙です。
Android 4.4.2
ドキュメントから here から、MediaScannerConnection.scanFileを呼び出す必要があります。
// Tell the media scanner about the new file so that it is
// immediately available to the user.
MediaScannerConnection.scanFile(this,
new String[] { file.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
上記の回答は、ファイルの作成に適しています。後でファイルを削除し、その変更も反映する場合は、次のいずれかを実行できます。最初に、動作しているように見えるが一部のデバイスで問題を引き起こす2つのソリューションを取り上げましょう。 1つ目は、削除されたファイルをスキャンすることです。
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
これは、削除されたファイルの多くのデバイスで機能しますが、一部のデバイスでは、実際には新しい0バイトファイルが作成されますが、これはおそらく望んでいないものです。その場合、<4.4 KitKatで実行している場合、これを行うことができます:
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(folder)));
フォルダーはfile.getParentFile()と同じです。残念ながら、KitKat 4.4以降では、これによりSecurityExceptionがスローされるため、これらのデバイスについては、Media Storeから直接削除してみてください。
final Uri externalFilesUri = Files.getContentUri("external");
context.getContentResolver().delete(externalFilesUri, Files.FileColumns.DATA + "=?", new String[] {file.getAbsolutePath()});
KitKatで動作しないACTION_MEDIA_MOUNTEDの回避策としてこれをテストしましたが、Nexus 5でのテストで動作します。