Nexus 4 không hiển thị tệp qua MTP


80

Tôi đang cố gắng ghi một tệp XML đơn giản vào thẻ SD và tôi nhận thấy rằng Nexus 4 của tôi có ghi tệp, nhưng nó không thể xem được thông qua giao thức MTP sử dụng Windows 7.

mã:

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();
    }
}

Tôi có thể xem tệp trên chính điện thoại bằng Trình quản lý tệp Astro:

Ảnh chụp màn hình

nhưng Windows không nhìn thấy nó ...:

Ảnh chụp màn hình

adb shell trên thư mục hiển thị:

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

Điều gì đang xảy ra với Nexus 4 của tôi? Tại sao nó lại ẩn những thứ của tôi khỏi Windows?


1
Tôi nghĩ rằng tôi đã làm gì đó sai. Bây giờ tôi biết rằng tôi không đơn độc.
neverMind 9

Câu trả lời:


72

Có vẻ là một sự cố đã biết ảnh hưởng đến quyền truy cập tệp USB của Android qua MTP . Bộ nhớ đệm MTP đã lỗi thời cho đến khi khởi động lại điện thoại.

Một cách giải quyết là:

  • Xóa dữ liệu của ứng dụng "Bộ nhớ phương tiện"
  • Sử dụng ứng dụng SDrescan hoặc SD Scanner (cũng hoạt động trên Android 4.4 / 5, có sẵn trên F-Droid ) để buộc cập nhật

Hoặc chỉ cần tránh sử dụng USB. Sự cố không ảnh hưởng đến các phương pháp truy cập tệp khác. Ví dụ, hãy thử dùng AirDroid để chuyển tệp.


Lưu ý: Điều này không hoạt động đối với Android 5.0.2: Sau khi xóa "Media Storage" và sử dụng SD Rescanner, các thư mục xuất hiện trong Windows 7 dưới dạng tệp 4K không thể mở được. Giải pháp duy nhất lúc đó là xóa một lần nữa Media Storage và khởi động lại thiết bị


2
Cài đặt SDrescan, chạy nó: đã sửa! Thanks a lot
PiTheNumber

Điều này không xảy ra trước đây nhưng ngày nay đã xảy ra. BTW tôi khởi động lại sẽ hoạt động IDK tại sao nó không hoạt động.
Muhammad Babar

Thật kỳ lạ sau khi khởi động lại điện thoại 3 lần nó đã xuất hiện.
Muhammad Babar

Điều này không hoạt động đối với Android 5.0.2: Sau khi xóa "Media Storage" và sử dụng SD Rescanner, các thư mục sẽ xuất hiện trong Windows 7 dưới dạng tệp 4K không thể mở được. Giải pháp duy nhất lúc đó là xóa một lần nữa Media Storage và khởi động lại thiết bị.
Antonio

Điều này cũng không hoạt động trên Nexus 7 Android 4.4.2. Máy Mac của tôi đang báo cáo rằng thư mục tùy chỉnh của tôi là một tệp 4k.
Joe Lapp

44

Bạn có thể sử dụng mã sau sau khi đóng tệp

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

Nguồn: https://code.google.com/p/android/issues/detail?id=38282


11
Hoàn hảo. Đây sẽ là giải pháp cho câu hỏi này.
Sorcerer

Giải pháp này không hoạt động đối với tôi trên Nexus 7, Android 4.4.2, kết nối với máy Mac. Tôi đang tạo một thư mục mới trong bộ nhớ ngoài và lưu trữ các tệp trong thư mục đó. Nếu tôi chỉ chạy điều này trên các tệp trong thư mục, máy Mac không hiển thị gì. Nếu tôi cũng chạy nó trên thư mục mới của mình, máy Mac sẽ hiển thị rằng thư mục của tôi là tệp 4k (chứ không phải thư mục). Tôi cũng đã thử gọi context.sendBroadcast()mà không có tác dụng.
Joe Lapp

Tôi chỉ thực hiện thao tác quét phương tiện và phát các tệp được tạo trong thư mục Tải xuống tiêu chuẩn và chúng không bao giờ hiển thị khi kết nối với Mac.
Joe Lapp

Ah. Không thể thực hiện điều này từ onDestroy (). Nó hoạt động nếu tôi làm điều đó ở nơi khác. Tôi có thể làm điều đó tại thời điểm tôi tạo tệp, nhưng sau đó trình duyệt tệp trên máy tính để bàn hiển thị kích thước bằng không. Mặc dù vậy, khi tôi sao chép tệp qua, nó sẽ sao chép toàn bộ tệp.
Joe Lapp

Hoạt động với 8.1. Các tệp đã xóa chỉ biến mất sau khi khởi động lại. Với điều này, các tệp được viết ít nhất sẽ xuất hiện ngay lập tức trên Trình duyệt tệp của Hệ thống được gắn.
Midson

5

Sau khi dành hàng giờ cho vấn đề này, tôi đã giải quyết như thế này:

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());
} 

Vấn đề là bạn chỉ phải quét các tệp (không phải thư mục) và sau đó lặp lại đệ quy cho mỗi thư mục

CHỈNH SỬA Ngoài ra, nếu bạn không muốn thêm ảnh vào album ảnh của mình (mà chỉ nội dung của bạn xuất hiện qua giao thức mtp), hãy nhớ đặt một .nomediatệp trống trong thư mục của bạn trước khi quét lại, như sau:

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

Câu trả lời rất hữu ích, tôi đã có thể sử dụng nó một cách đệ quy và bây giờ tôi thấy tất cả các tệp mới được tạo qua MTP. Dù sao, làm thế nào để đối phó với việc hủy liên kết của dịch vụ? Tôi gặp lỗi ServiceConnectionLeaked: "Hoạt động đã bị rò rỉ ServiceConnection android.media.MediaScannerConnection@42164d98 ban đầu được liên kết ở đây". Bất kỳ ý tưởng nào về cách giải quyết nó vì sử dụng MediaScannerConnection.scanFolder () tĩnh sẽ không có cơ hội ngắt kết nối () dịch vụ bị ràng buộc ...
Andre

3

Trên Xperia Z, mã dưới đây hoạt động tốt:

  String screenShotFile = "....";
  activity.sendBroadcast(new Intent(
        Intent.ACTION_MEDIA_MOUNTED, Uri
                .fromFile(screenShotFile)));

cho 4.4+ sử dụng:

activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                                Uri.fromFile(screenShotFile)));

(rất tiếc là tôi không nhớ mình đã kiểm tra nó đủ tốt chưa)

http://commonsware.com/blog/2013/11/06/android-4p4-permission-regressions.html


3

Cách giải quyết tốt nhất mà tôi tìm thấy đối với lỗi được đề cập trong câu trả lời được chấp nhận là sao chép dữ liệu từ Hệ điều hành Android sang một máy / máy chủ khác (Linux, MacOS, windows) bằng SSH.

  • Đảm bảo rằng thiết bị (Android) và máy (nơi bạn muốn sao chép dữ liệu) có thể truy cập được theo IP hoặc tên máy chủ, chẳng hạn bằng cách kết nối chúng với cùng một mạng wifi.

Tùy chọn và được khuyến nghị

  • Kết nối thiết bị Android bằng chia sẻ kết nối USB. Điều này đảm bảo tốc độ nhanh do kết nối có dây và đảm bảo rằng cả hai địa chỉ IP đều hiển thị với nhau vì cả hai đều ở trong cùng một mạng.

Trong thiết bị Android

  • Cài đặt máy chủ SSH. SSHelper hoạt động như một sự quyến rũ
  • Chạy SSHelper và chuyển đến tab cấu hình để lấy địa chỉ IP, cổng và mật khẩu. Trong ví dụ dưới đây, chúng là 192.168.1.5, 2222 và 'admin'.
  • Mật khẩu mặc định là quản trị viên nhưng nếu bạn quyết định thay đổi, hãy nhấn vào nút "Khởi động lại máy chủ với các giá trị mới" sau khi thay đổi

Trong máy

  • Cài đặt rsync. Nếu tình cờ sử dụng Ubuntu, nó đã được cài đặt theo mặc định.
  • Mở một trình bao và nhập lệnh sau. Thay đổi địa chỉ IP và cổng thành các giá trị của bạn

rsync -avzhP --inplace --info=progress2 -e 'ssh -p 2222' 192.168.1.5:/storage/emulated/0/DCIM/Camera/ /home/username/path/to/pics/

  • bạn sẽ nhận được lời nhắc sau, hãy nhập mật khẩu của bạn

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

Các đề xuất khác không phù hợp với tôi:

  • Thiết bị không hỗ trợ sử dụng chế độ lưu trữ USB thay vì MTP (như nhiều thiết bị mới hơn khác).
  • Không có tùy chọn nào trong hệ điều hành của tôi (Android 6.0.1) để xóa dữ liệu ứng dụng "Bộ nhớ phương tiện".
  • Các phương pháp chia sẻ tệp tin qua mạng khác đã bị hạn chế. FTP không đảm bảo tính toàn vẹn của tệp. Nếu kết nối bị ngắt, nó sẽ ghi đè hoặc bỏ qua tất cả các tệp, vì vậy một trong các tệp có thể chưa hoàn thành. Các giao thức khác có thể khó cài đặt và các ứng dụng khác có thể sử dụng các giao thức độc quyền.

2

thông báo / lưu trữ / giả lập. Android 4.2 có một số công cụ truy cập theo từng ứng dụng / người dùng được mô phỏng thú vị đang diễn ra, ví dụ: thẻ / sdcard / riêng cho từng người dùng. Hãy thử di chuyển tệp sang / sdcard / thay vì sdcard giả lập được hiển thị.


11
mọi thứ đều là liên kết tới /storage/emulated/legacy, bản thân nó là liên kết /mnt/shell/emulated/0chứa tệp.
mooncheese

2

Đoạn mã đơn giản được đề xuất cho câu hỏi Làm cách nào để làm mới MediaStore trên Android? có cập nhật cần thiết của MediaStore không, nếu được gọi sau khi tôi đặt tệp vào bộ nhớ ngoài. Nội dung trên Nexus 4 của tôi được làm mới ngay lập tức trong trình khám phá tệp Window 7.


Chỉ cần trải nghiệm, rằng nó có thể ngừng cập nhật cuối cùng.
stephan

1

Tôi cần tạo một thư mục và sao chép một số tệp mẫu cho ứng dụng của mình. Sau rất nhiều thử nghiệm và nghiên cứu, quy trình sau đây đã hoạt động hoàn hảo đối với tôi:

1) Đã tạo thư mục bằng File.mkdir ().

2) Các tệp được sao chép trong thư mục và chạy MediaScanner trên mỗi tệp.

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

3) Chạy MediaScanner trên thư mục.

MediaScannerConnection.scanFile(context, new String[]{directory.getAbsolutePath()}, null, null);

Kết quả: Các tệp và thư mục xuất hiện ngay lập tức trên PC qua MTP.


Quét cả thư mục tệp cụ thể được tạo đã làm việc cho tôi. Bạn cũng có thể kết hợp hai lệnh gọi bằng cách chuẩn bị một mảng String [] gồm hai phần tử trong đó cả tệp và phần tử gốc đều được liệt kê. Xem thêm stackoverflow.com/a/25086535/911550
parvus,

1

Gặp sự cố tương tự với OneplusOne của tôi:

Sau khi cập nhật phần mềm (lên 6.0.1), tôi không thể xem ảnh máy ảnh của mình khi kết nối với máy tính (PTP và MTP). Cả SDRescan và SDscanner của ứng dụng đều không có tác dụng.

Giải pháp của tôi là sao chép tất cả ảnh từ DCIM sang một thư mục khác bằng thiết bị đầu cuối hoặc bất kỳ ứng dụng File Explorer nào trên Điện thoại. Khi kết nối với máy tính, tôi có thể xem các tệp đã sao chép .. tôi đã chuyển chúng vào máy tính và xóa thư mục máy ảnh của mình. Không có giải pháp vĩnh viễn nhưng nó đã khắc phục sự cố cho tôi ít nhất cho đến khi tôi thực hiện sao lưu tiếp theo. = D


0

Các câu trả lời trên là tốt cho việc tạo tệp. Nếu sau đó bạn xóa tệp và muốn thay đổi đó cũng được phản ánh, bạn có thể thực hiện một trong những cách sau; Trước tiên chúng ta hãy đề cập đến hai giải pháp có vẻ như chúng hoạt động, nhưng sẽ gây ra sự cố trên một số thiết bị. Cách đầu tiên là quét tệp đã xóa:

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));

Tính năng này hoạt động trên nhiều thiết bị đối với các tệp đã xóa, nhưng trên một số thiết bị, nó thực sự sẽ khiến tệp 0 byte mới được tạo, có thể không phải là điều bạn muốn. Trong trường hợp đó, nếu bạn đang chạy trên <4.4 KitKat, bạn có thể thực hiện điều này:

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(folder)));

Trong đó thư mục bằng file.getParentFile (). Thật không may, trên KitKat 4.4 trở lên, điều này sẽ khiến SecurityException bị ném, vì vậy đối với những thiết bị đó, bạn có thể thử xóa trực tiếp khỏi Media Store:

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

Tôi đã thử nghiệm cái này như một giải pháp thay thế cho ACTION_MEDIA_MOUNTED không hoạt động trên KitKat và nó hoạt động trong thử nghiệm của tôi trên Nexus 5.


0

Gần đây, tôi gặp phải vấn đề tương tự nhưng một số nghiên cứu bổ sung đã giúp tìm ra các tệp ẩn. Có vẻ như Google đã thực hiện một số thay đổi trong cấu trúc lưu trữ. Tất cả các tệp này đã được chuyển sang một thư mục khác This Computer\HTC One\Internal Storage\storage\emulated\0. Nhưng thật lạ là không phải tất cả các tệp đều được chuyển đi.

Android 4.4.2


0

Từ tài liệu ở đây , bạn cần gọi 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);
    }
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.