Nexus4がMTP経由でファイルを表示しない


80

単純なXMLファイルをSDカードに書き込もうとしていますが、Nexus 4がファイルを書き込んでいることに気付きましたが、Windows7を使用した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から隠しているのですか?


1
私は何か間違ったことをしていると思った。今、私は私が一人ではないことを知っています。
neverMind9

回答:


72

MTPを介したAndroidUSBファイルアクセスに影響する既知の問題のようです。MTPキャッシュは、電話機を再起動するまで古くなります。

この問題を回避するには、次のとおりです。

  • 「メディアストレージ」アプリのデータをクリアする
  • 使用SDrescan又はSDスキャナ(また、上で利用可能な、アンドロイド4.4 / 5.0で動作するF-ドロイド更新を強制する)アプリ

または、USBの使用をまったく避けてください。この問題は、ファイルにアクセスする他の方法には影響しません。たとえば、AirDroidを試してファイルを転送します。


注:これはAndroid 5.0.2では機能しません:「メディアストレージ」をクリアしてSDリスキャナーを使用すると、フォルダーはWindows7で開かない4Kファイルとして表示されます。その時点での唯一の解決策は、メディアストレージをもう一度クリアしてデバイスを再起動することです


2
SDrescanをインストールして実行します:修正済み!
どうも

これは以前は起こっていませんでしたが、今日は起こりました。ところで、再起動するとIDKが機能するはずです。なぜ機能しないのですか。
ムハンマドババール

電話を3回再起動した後、奇妙なことが現れました。
ムハンマドババール2015

これはAndroid5.0.2では機能しません。「メディアストレージ」をクリアしてSDリスキャナーを使用すると、フォルダーはWindows7で開かない4Kファイルとして表示されます。その時点での唯一の解決策は、メディアストレージをもう一度クリアして、デバイスを再起動することです。
アントニオ

これはNexus7 Android4.4.2でも機能しませんでした。私のMacは、私のカスタムディレクトリが4kファイルであると報告しています。
ジョーラップ2015

44

ファイルを閉じた後、次のコードを使用できます

MediaScannerConnection.scanFile(this, new String[] { file.getAbsolutePath() }, null, null);

ソース:https//code.google.com/p/android/issues/detail?id = 38282


11
完璧です。これがこの質問の解決策になるはずです。
ソーサラー

このソリューションは、Macに接続しているNexus 7、Android4.4.2では機能しません。外部ストレージに新しいフォルダを作成し、そのフォルダにファイルを保存しています。フォルダ内のファイルに対してのみこれを実行すると、Macには何も表示されません。新しいディレクトリでも実行すると、Macは私のディレクトリが4kファイル(ディレクトリではない)であることを示します。私もcontext.sendBroadcast()効果がないように呼び出してみました。
ジョーラップ2015

標準のダウンロードディレクトリに作成されたメディアスキャンとブロードキャストファイルを試してみましたが、Macに接続しても表示されませんでした。
ジョーラップ2015

ああ。これはonDestroy()からは実行できません。他の場所でやればうまくいきます。ファイルの作成時に実行できますが、デスクトップファイルブラウザにゼロバイトのサイズが表示されます。それでも、ファイルをコピーすると、ファイル全体がコピーされます。
ジョーラップ2015

8.1で動作します。削除されたファイルは再起動後にのみ消えます。これにより、少なくとも書き込まれたファイルがマウントされたシステムのファイルブラウザにすぐに表示されます。
ミッドソン

5

この問題に何時間も費やした後、私は次のように解決しました:

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に対して再帰的に繰り返す必要があるということです。

編集 さらに、写真をフォトアルバムに追加したくない場合(ただし、コンテンツのみをmtpプロトコルで表示したい.nomedia場合)、次のように、再スキャンする前に空のファイルをフォルダーに配置することを忘れないでください。

new File(myFolder + File.separator + ".nomedia").createNewFile();
rescanFolder(myFolder);

非常に便利な答えです。再帰的に使用することができ、MTPを介して新しく作成されたすべてのファイルが表示されます。とにかく、サービスのバインド解除に対処する方法は?ServiceConnectionLeakedエラーが発生します:「アクティビティにより、元々ここにバインドされていたServiceConnectionandroid.media.MediaScannerConnection@42164d98がリークされました」。MediaScannerConnection.scanFolder()を静的に使用してから、それを解決する方法についてのアイデアは、バインドされたサービスをdisconnect()する機会がありません...
Andre

4

受け入れられた回答に記載されているバグに対して私が見つけた最善の回避策は、SSHを使用してAndroid OSから別のマシン/サーバー(Linux、MacOS、Windows)にデータをコピーすることです。

  • デバイス(Android)とマシン(データをコピーする場所)が、同じWi-Fiネットワークに接続するなどして、IPまたはホスト名ごとに到達可能であることを確認します。

オプションで推奨

  • USBテザリングを使用してAndroidデバイスを接続します。これにより、有線接続により高速が保証され、両方が同じネットワーク内にあるため、両方のIPアドレスが相互に認識されることが保証されます。

Androidデバイスの場合

  • SSHサーバーをインストールします。SSHelperは魅力のように機能しました
  • SSHelperを実行し、[構成]タブに移動して、IPアドレス、ポート、およびパスワードを取得します。以下の例では、それらは192.168.1.5、2222および 'admin'です。
  • デフォルトのパスワードはadminですが、変更する場合は、変更後に[サーバーを新しい値で再起動する]ボタンをクリックしてください。

マシンで

  • rsyncをインストールします。Ubuntuを使用する場合は、デフォルトですでにインストールされています。
  • シェルを開き、次のコマンドを入力します。IPアドレスとポートを自分の値に変更します

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) username@192.168.1.5's password: admin receiving incremental file list

他の提案は私にはうまくいきませんでした:

  • MTPの代わりにUSBストレージモードを使用することは、デバイスではサポートされていません(他の多くの新しいデバイスと同様)。
  • 私のOS(Android 6.0.1)には、「メディアストレージ」アプリのデータをクリアするオプションがありませんでした。
  • ネットワークを介してファイルを共有する他の方法には、欠点がありました。FTPはファイルの整合性を保証しません。接続が切断されると、すべてのファイルが上書きまたはスキップされるため、ファイルの1つが不完全である可能性があります。他のプロトコルはインストールが難しい場合があり、他のアプリは独自のプロトコルを使用する場合があります。

3

以下のXperiaZでは、コードは問題なく機能しました。

  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


2

/ storage / emulatedに注意してください。Android 4.2では、ファンキーなエミュレートされたアプリ/ユーザーごとのアクセス機能が実行されています。たとえば、ユーザーごとに個別の/ sdcard /があります。表示されているエミュレートされたSDカードではなく、ファイルを/ sdcard /に移動してみてください。


11
/storage/emulated/legacyとにかくすべてがリンクであり、それ自体が/mnt/shell/emulated/0ファイルを含むリンクです。
moonlightcheese

2

質問するために提案された単純なコードAndroidでMediaStoreを更新するにはどうすればよいですか?外部ストレージにファイルを置いた後に呼び出された場合、MediaStoreの必要な更新を行います。Nexus 4のコンテンツは、Windows7のファイルエクスプローラーですぐに更新されます。


経験したばかりですが、最終的には更新が停止する可能性があります。
ステファン2013

1

ディレクトリを作成し、アプリ用にいくつかのサンプルファイルをコピーする必要がありました。多くの実験と研究の後、次の手順は私にとって完璧に機能しました:

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に瞬時に表示されます。


ディレクトリ作成された特定のファイルの両方をスキャンすることは私のために働いた。ファイルと親の両方がリストされている2つの要素のString []配列を準備することにより、2つの呼び出しを組み合わせることもできます。stackoverflow.com/a/25086535/911550
parvus 2016年

1

私のOneplusOneで同様の問題がありました:

ソフトウェアの更新(6.0.1へ)後、コンピューター(PTPおよびMTP)に接続したときにカメラの写真を見ることができませんでした。アプリのSDRescanとSDscannerはどちらも効果がありませんでした。

私の解決策は、端末または電話のファイルエクスプローラーアプリを使用して、すべての画像をDCIMから別のフォルダーにコピーすることでした。コンピューターに接続すると、コピーしたファイルを見ることができました。それらをコンピューターに移動し、カメラフォルダーをクリアしました。恒久的な解決策はありませんが、少なくとも次のバックアップを行うまでは問題は解決しました。= D


0

上記の回答は、ファイルの作成に適しています。後でファイルを削除し、その変更も反映させたい場合は、次のいずれかを実行できます。最初に、機能しているように見えるが、一部のデバイスで問題が発生する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)));

ここで、folderはfile.getParentFile()と同じです。残念ながら、KitKat 4.4以降では、これによりSecurityExceptionがスローされるため、これらのデバイスの場合は、メディアストアから直接削除してみてください。

final Uri externalFilesUri = Files.getContentUri("external");
context.getContentResolver().delete(externalFilesUri, Files.FileColumns.DATA + "=?", new String[] {file.getAbsolutePath()});

KitKatで動作しないACTION_MEDIA_MOUNTEDの回避策としてこれをテストしましたが、Nexus5でのテストで動作します。


0

最近私は同じ問題に直面しましたが、いくつかの追加の調査が隠しファイルを見つけるのに役立ちました。Googleはストレージ構造にいくつかの変更を加えたようです。これらのファイルはすべて別のフォルダに移動さ​​れましたThis Computer\HTC One\Internal Storage\storage\emulated\0。しかし、すべてのファイルが移動されたわけではないのは不思議です。

Android 4.4.2


0

こちらのドキュメントから、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);
    }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.