[android] 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 파일 관리자를 사용하여 전화 자체에서 파일을 볼 수 있습니다.

스크린 샷

그러나 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에서 내 물건을 숨기는 이유는 무엇입니까?



답변

MTP를 통한 Android USB 파일 액세스에 영향을 미치는 알려진 문제인 것 같습니다 . MTP 캐시는 전화기를 재부팅 할 때까지 오래됩니다.

해결 방법 입니다 :

  • “미디어 저장소”앱의 데이터를 지 웁니다.
  • 사용 SDrescan 또는 SD 스캐너 (도에, 안드로이드 4.4 / 5에 사용할 수 작동 F-이드 업데이 트를 강제로) 응용 프로그램을

또는 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에 대해 반복적으로 반복해야한다는 것입니다.

편집
또한 사진을 사진 앨범에 추가하지 않으려면 (하지만 콘텐츠 만 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


답변

허용 된 답변에 언급 된 버그에 대해 찾은 가장 좋은 해결 방법 은 SSH를 사용하여 Android OS에서 다른 컴퓨터 / 서버 (Linux, MacOS, Windows)로 데이터를 복사하는 것입니다.

  • 장치 (Android)와 머신 (데이터를 복사하려는 위치)에 IP 또는 호스트 이름별로 연결할 수 있는지 확인합니다 (예 : 동일한 Wi-Fi 네트워크에 연결).

선택 및 권장

  • USB 테 더링을 사용하여 Android 장치를 연결합니다. 이렇게하면 유선 연결로 인해 빠른 속도가 보장되고 두 IP 주소가 동일한 네트워크에 있기 때문에 두 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는 파일 무결성을 보장하지 않습니다. 연결이 끊어지면 모든 파일을 덮어 쓰거나 건너 뛰므로 파일 중 하나가 불완전 할 수 있습니다. 다른 프로토콜은 설치하기 어려울 수 있으며 다른 앱은 독점 프로토콜을 사용할 수 있습니다.


답변

고시 / 저장 / 에뮬레이션. Android 4.2에는 각 사용자에 대한 별도의 / sdcard /와 같이 펑키 한 에뮬레이트 된 앱별 / 사용자 별 액세스 항목이 있습니다. 표시된 에뮬레이트 된 sdcard 대신 파일을 / sdcard /로 이동해보십시오.


답변

질문에 제안 된 간단한 코드 는 Android에서 MediaStore를 어떻게 새로 고칠 수 있습니까? 외부 저장소에 파일을 넣은 후 호출되면 MediaStore의 필요한 업데이트를 수행합니다. 내 Nexus 4의 콘텐츠는 Window 7 파일 탐색기에서 즉시 새로 고쳐집니다.