Nexus 4가 MTP를 통해 파일을 표시하지 않음


80

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


1
나는 내가 뭔가 잘못하고 있다고 생각했다. 이제 나는 혼자가 아님을 압니다.
neverMind9

답변:


72

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

해결 방법 입니다 :

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

또는 USB를 전혀 사용하지 마십시오. 이 문제는 파일에 액세스하는 다른 방법에 영향을주지 않습니다. 예를 들어 AirDroid 를 사용하여 파일을 전송하십시오.


참고 : Android 5.0.2에서는 작동하지 않습니다. "미디어 저장소"를 지우고 SD Rescanner를 사용하면 폴더가 Windows 7에서 열 수없는 4K 파일로 나타납니다. 이 시점에서 유일한 해결책은 미디어 저장소를 다시 한 번 지우고 장치를 다시 시작하는 것입니다.


2
SDrescan을 설치하고 실행합니다. 수정 됨! 고마워요
PiTheNumber

이것은 전에는 일어나지 않았지만 오늘은 일어났습니다. BTW i 재부팅이 작동하지 않는 이유 IDK가 작동합니다.
Muhammad Babar

전화기를 3 번 ​​재부팅 한 후 이상하게 나타났습니다.
Muhammad Babar

Android 5.0.2에서는 작동하지 않습니다. "미디어 저장소"를 지우고 SD Rescanner를 사용하면 폴더가 Windows 7에서 열 수없는 4K 파일로 나타납니다. 이 시점에서 유일한 해결책은 미디어 저장소를 다시 한 번 지우고 장치를 다시 시작하는 것입니다.
Antonio

Nexus 7 Android 4.4.2에서도 작동하지 않았습니다. 내 Mac에서 내 사용자 지정 디렉터리가 4k 파일이라고보고합니다.
조 라플란드

44

파일을 닫은 후 다음 코드를 사용할 수 있습니다.

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

출처 : https://code.google.com/p/android/issues/detail?id=38282


11
완전한. 이것이이 질문에 대한 해결책이되어야합니다.
Sorcerer

이 솔루션은 Mac에 연결된 Nexus 7, Android 4.4.2에서 작동하지 않습니다. 외부 저장소에 새 폴더를 만들고 해당 폴더에 파일을 저장하고 있습니다. 폴더의 파일에서만 실행하면 Mac에 아무것도 표시되지 않습니다. 내 새 디렉토리에서도 실행하면 Mac은 내 디렉토리가 디렉토리가 아닌 4k 파일이라고 표시합니다. 나는 또한 context.sendBroadcast()아무 효과가 없도록 부르려고 노력했다 .
Joe Lapp

방금 표준 다운로드 디렉토리에 생성 된 미디어 스캔 및 방송 파일을 가지고 놀았는데 Mac에 연결할 때 나타나지 않았습니다.
Joe Lapp 2015

아. 이것은 onDestroy ()에서 수행 할 수 없습니다. 다른 곳에서하면 작동합니다. 파일을 만들 때 할 수 있지만 데스크톱 파일 브라우저에 0 바이트 크기가 표시됩니다. 그럼에도 불구하고 파일을 복사하면 전체 파일이 복사됩니다.
Joe Lapp

8.1에서 작동합니다. 재부팅 후 삭제 된 파일이 사라집니다. 이를 통해 최소한 기록 된 파일이 마운트 된 시스템의 파일 브라우저에 즉시 나타납니다.
Midson

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 오류가 발생합니다. "Activity에서 원래 여기에 바인딩 된 ServiceConnection android.media.MediaScannerConnection@42164d98을 유출했습니다." MediaScannerConnection.scanFolder ()를 사용하기 때문에 그것을 해결하는 방법에 대한 어떤 생각 정적 분리에 기회 () 바운드 서비스를 ... 없다
앙드레

3

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

허용 된 답변에 언급 된 버그에 대해 찾은 가장 좋은 해결 방법 은 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는 파일 무결성을 보장하지 않습니다. 연결이 끊어지면 모든 파일을 덮어 쓰거나 건너 뛰므로 파일 중 하나가 불완전 할 수 있습니다. 다른 프로토콜은 설치하기 어려울 수 있으며 다른 앱은 독점 프로토콜을 사용할 수 있습니다.

2

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


11
/storage/emulated/legacy어쨌든 모든 것은 /mnt/shell/emulated/0파일을 포함 하는 링크 인 링크 입니다.
moonlightcheese


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에 즉시 나타납니다.


디렉토리 생성 된 특정 파일을 모두 스캔하면 저에게 효과적이었습니다. 파일과 부모가 모두 나열된 두 요소의 String [] 배열을 준비하여 두 호출을 결합 할 수도 있습니다. 참조 stackoverflow.com/a/25086535/911550
parvus

1

내 OneplusOne에 비슷한 문제가있었습니다.

소프트웨어 업데이트 (6.1.1로) 후 컴퓨터 (PTP 및 MTP)에 연결할 때 카메라 사진을 볼 수 없습니다. 앱의 SDRescan과 SDscanner는 모두 효과가 없었습니다.

내 솔루션은 터미널 또는 전화의 파일 탐색기 앱을 사용하여 DCIM의 모든 사진을 다른 폴더로 복사하는 것이 었습니다. 컴퓨터에 연결할 때 복사 된 파일을 볼 수있었습니다 .. 컴퓨터로 파일을 옮기고 카메라 폴더를 지 웠습니다. 영구적 인 해결책은 없지만 적어도 다음 백업을 수행 할 때까지 문제가 해결되었습니다. = D


0

위의 답변은 파일 생성에 적합합니다. 나중에 파일을 삭제하고 변경 사항도 반영하려면 다음 중 하나를 수행 할 수 있습니다. 먼저 작동하는 것처럼 보이지만 일부 장치에서 문제를 일으킬 수있는 두 가지 솔루션을 살펴 보겠습니다. 첫 번째는 삭제 된 파일을 스캔하는 것입니다.

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

최근에 동일한 문제에 직면했지만 몇 가지 추가 연구가 숨겨진 파일을 찾는 데 도움이되었습니다. Google이 저장 구조를 일부 변경 한 것 같습니다. 이 모든 파일은 다른 폴더로 이동되었습니다 This Computer\HTC One\Internal Storage\storage\emulated\0. 그러나 모든 파일이 이동되지 않은 것이 이상합니다.

안드로이드 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.