web-dev-qa-db-ja.com

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

単純な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を使用して、電話機自体でファイルを確認できます。

Screenshot

しかし、Windowsはそれを見ません...:

Screenshot

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から私のものを隠すのはなぜですか?

76
moonlightcheese

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

回避策 は次のとおりです。

  • 「メディアストレージ」アプリのデータを消去する
  • SDrescan または SD Scanner を使用します(Android 4.4/5、 F-Droid で利用可能) =)更新を強制するアプリ

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


注:これはAndroid 5.0.2:「メディアストレージ」をクリアし、SD Rescannerを使用した後、Windows 7で開かない4Kファイルとしてフォルダーが表示されます。その唯一のソリューションポイントは、もう一度メディアストレージをクリアし、デバイスを再起動することです

71
Kevin Panko

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

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

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

43
Sathesh

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

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);
4
lviggiani

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

3
marcinj

/ storage/emulatedに注意してください。 Android 4.2では、ユーザーごとに個別の/ sdcard /など、アプリ/ユーザーごとのエミュレートされたファンキーなエミュレートが行われます。エミュレートされたsdcardの代わりに/ sdcard /示されています。

2
Adam Weld

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

  • デバイス(Android)およびマシン(データのコピー先)がIPまたはホスト名ごとに到達可能であることを確認します。たとえば、それらを同じwifiネットワークに接続します。

オプションおよび推奨

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

Android device

  • 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) [email protected]'s password: admin receiving incremental file list

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

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

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

2
stephan

OneplusOneで同様の問題が発生しました:

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

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

1
Michael Saiz

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

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

1
Chebyr

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

Android 4.4.2

0
Aray

ドキュメントから 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);
    }
});
0
Luca

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

0
Learn OpenGL ES