2013-05-06 27 views
5

Ứng dụng của tôi tải xuống các jpg từ một trang web bằng cách sử dụng DownloadManager và lưu trữ chúng trong thư mục /sdcard/Android/name.app/ để sử dụng trong một số Phân đoạn trong ứng dụng. Tuy nhiên, quá trình tải xuống hoạt động tốt, các jpg hiển thị trong ứng dụng Thư viện mà tôi không muốn vì chúng chỉ là tài sản cho ứng dụng của tôi. Tôi không thể tìm ra cách để chúng không hiển thị trong ứng dụng Thư viện. Tôi thậm chí đã thử thêm các tập tin .nomedia vào các thư mục được tạo ra. Bất kỳ trợ giúp sẽ được đánh giá cao!Ngăn Trình quét Phương tiện Quét Quét JPG Tải xuống bằng Trình quản lý tải xuống trên Android? (Nhà phát triển)

DownloadManager myDownloadManager = (DownloadManager) myActivity.getSystemService(Context.DOWNLOAD_SERVICE); 
    Request myRequest = new Request(Uri.parse(episodeArtLink)); 
    myRequest.setNotificationVisibility(Request.VISIBILITY_HIDDEN); 
    myRequest.setVisibleInDownloadsUi(false); 
    myRequest.setDestinationInExternalFilesDir(myActivity, Environment.DIRECTORY_DOWNLOADS, myFilename); 
    myDownloadManager.enqueue(myRequest); 

Vấn đề dường như là do MediaScanner đang thêm hình ảnh vào cơ sở dữ liệu hệ thống mặc dù tôi chưa yêu cầu.

Tôi đã tạo một ứng dụng thử nghiệm thể hiện sự cố. Nếu bạn nhấp vào nút Tải xuống, biểu trưng của Google sẽ hiển thị trong ứng dụng. Nếu bạn truy cập ứng dụng Thư viện, bạn cũng sẽ thấy biểu trưng của Google trong thư viện có tên Tải xuống. Nếu bạn vào Cài đặt -> Ứng dụng và Xóa dữ liệu cho Bộ sưu tập và Bộ nhớ phương tiện thì biểu trưng của Google sẽ biến mất và sẽ không hiển thị lại trong Thư viện vì tệp nằm trong/sdcard/Android/data/được bảo vệ bởi .nomedia. Bạn có thể truy cập /sdcard/Android/data/com.example.downloadmanagertest/files/Download/ để xác minh rằng hình ảnh vẫn còn trên điện thoại. Ngay cả sau khi khởi động lại, hình ảnh sẽ không hiển thị trong Bộ sưu tập nếu bạn xóa Dữ liệu cho Bộ sưu tập và Bộ nhớ Phương tiện. Tôi đã thử nghiệm điều này trên cả Nexus 4 và Nexus 7 chạy 4.2.2.

Nguồn: https://dl.dropboxusercontent.com/u/114414/DownloadManagerTest.zip

+0

Tôi nghĩ rằng câu hỏi này nên có nhiều hơn "chung chung". Tôi đã có một vấn đề tương tự khi tôi cài đặt TomTom: hàng ngàn biểu tượng xuất hiện trong bộ sưu tập của tôi! Có cách nào để hoàn thành "ẩn" một thư mục khỏi thư viện không? – AndreaCi

+0

Đây không phải là ứng dụng mà tôi đã tải xuống cho ứng dụng tôi đang phát triển. Tôi không muốn mọi người tải xuống ứng dụng phải tự tìm một công việc. – notkevin

+0

Bạn có cố gắng tải ảnh xuống thư mục không chứa tệp phương tiện (tệp có tên .nomedia) không? Tệp này phải ngăn các tệp quét trong thư mục. –

Trả lời

5

Giải pháp

Máy quét phương tiện truyền thông cuối cùng sẽ sớm hay muộn quét thẻ media cho phương tiện truyền thông và chỉ số họ. Bước trực quan đầu tiên là để lừa Scanner không biết rằng tập tin là một tập tin media. Điều này có thể đạt được bằng cách lưu các hình ảnh mà không có phần mở rộng. Một giải pháp dễ dàng là để thêm notkevin vào cuối tên tệp. Đơn giản chỉ cần:

Thay vì

myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, Uri.parse(downloadLink).getLastPathSegment()); 

Sử dụng này

String filename = Uri.parse(downloadLink).getLastPathSegment() + "notkevin"; 
myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, filename); 

Tuy nhiên điều này là không đủ trong trường hợp của bạn kể từ khi bạn đang sử dụng Download Manager (chỉ đoán). Các phương tiện truyền thông quét bằng cách nào đó biết về các mục tải về và thực tế là nó là một hình ảnh và, do đó, chỉ mục nó. Để không cho phép nó, sử dụng setMimeType như thế này:

myRequest.setMimeType("application/octet-stream"); 

PS: Có nhiều cách để thay đổi phần mở rộng khác vì thêm bạn hoặc tên của tôi vào cuối tên tập tin. Ví dụ, bạn có thể băm filename

String filename = hash(Uri.parse(downloadLink).getLastPathSegment()); 

public String hash(String victim) throws NoSuchAlgorithmException 
{ 
    MessageDigest md = MessageDigest.getInstance("SHA1"); 
    md.reset(); 
    byte[] buffer = victim.getBytes(); 
    md.update(buffer); 
    byte[] digest = md.digest(); 

    StringBuilder hexStr = new StringBuilder(); 
    for (int i = 0; i < digest.length; i++) { 
     hexStr.append(Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    return hexStr.toString(); 
} 
+1

Cảm ơn bạn! Có vẻ như giải pháp của bạn đã giải quyết được vấn đề. Tôi đã lưu các tệp vào thiết bị mà không có phần mở rộng .jpg. – notkevin

0

Tiền tố tên thư mục của bạn với một dấu chấm (/sdcard/Android/name.app/.photos/). Nếu điều đó không hiệu quả, hãy thử ẩn thư mục của bạn.

+0

Tôi đã thử tải các tệp xuống một thư mục như .photos nhưng vẫn không hoạt động. Mặc dù tôi không đặt allowScanningByMediaScanner(), Trình quản lý tải xuống vẫn đang thêm các tệp vào MediaScanner. Nếu tôi xóa bộ nhớ cho ứng dụng Media Storage, ứng dụng sẽ không tìm thấy lại hình ảnh. Làm thế nào tôi có thể ngăn MediaScanner nhìn thấy hình ảnh khi chúng được tải về? – notkevin

0

https://github.com/thest1/LazyList/blob/master/src/com/fedorvlasov/lazylist/ImageLoader.java

Nhìn vào phương pháp với những cái tên như getphoto, getbitmap trong liên kết ở trên.Dự án github LazyLoader có tất cả các phương thức bạn cần để sử dụng các gợi ý trong các câu trả lời khác để đưa phương tiện từ WEB, vào bộ nhớ đệm (bộ nhớ, Hệ thống tập tin) và sử dụng bitmap khi cần trong ứng dụng của bạn.

Trong tệp liên kết, nơi các bitmap vẫn tồn tại, chỉ cần áp dụng tệpName sẽ được nhận dạng khi cần bởi mô-đun của bạn NHƯNG KHÔNG RECOGNIZE bởi trình quét phương tiện.

nên thực hiện điều đó.

2

Tôi đã gặp sự cố tương tự này trong vài ngày ngay bây giờ. Tôi đã thử mọi sự kết hợp của việc tạo hidden directories, using different extensions, đặt .nomedia tệp trong root and image directories directories, tạo .nomediabefore the download, renaming directory (back and forth).

Rất tiếc, không có cách nào trong số này có vẻ phù hợp với tôi (trên Nexus 4). Sự hiểu biết của tôi là MediaScanner chỉ thực hiện quét lại khi khởi động điện thoại hoặc lắp bộ nhớ ngoài. Trong Nexus 4 (hoặc bất kỳ thiết bị nào không có khe cắm thẻ SD), việc lắp đặt này chỉ xảy ra ở boottime.

Tuy nhiên, các tệp được tải xuống bằng Android Download Manager sẽ được quét ngay lập tức (mặc dù chúng shouldn't be) và được đặt vào thư viện. Ngay cả khi bạn có tệp .nomedia, chúng vẫn kết thúc trong thư viện. Việc gỡ cài đặt ứng dụng không giúp ích gì vì hình thu nhỏ vẫn được lưu trong bộ nhớ cache (bạn có thể xóa chúng mà không cần khởi động lại bằng cách xóa bộ nhớ cache, dữ liệu và buộc đóng ứng dụng Thư viện và Bộ nhớ trong cài đặt). Nếu bạn khởi động lại điện thoại, Android sẽ lưu lại bộ nhớ ngoài, thấy rằng có một tệp .nomedia và sau đó xóa nó khỏi thư viện.

Vì vậy, khởi động lại/rescan này có thể khắc phục sự cố. Tuy nhiên chúng tôi không muốn bị liên tục yêu cầu người dùng phải khởi động lại điện thoại nên thay vì những gì làm việc cho tôi là để buộc Android để quét lại các lưu trữ bên ngoài sau khi tải thành công với:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

nào tôi nhận được từ Darshan's câu trả lời cho một câu hỏi tương tự và Jon.

Tôi thiết lập bộ thu phát sóng để nghe hoàn thành downloads và nếu chúng thành công, tôi sẽ gửi chương trình phát sóng. Dường như hoạt động - hình ảnh đã tải xuống trong ứng dụng của tôi không còn xuất hiện trong thư viện nữa.

0

Bạn cũng có thể đặt toàn bộ thư mục của mình không bị ảnh hưởng bởi Máy quét mà không bị thay đổi trong phần mở rộng tệp của bạn. Vui lòng tham khảo tệp ".nomedia" trong số link;

Ẩn tập tin của bạn từ Media Scanner

Bao gồm một tập tin rỗng tên .nomedia trong của bạn thư mục tập tin bên ngoài (chú ý dấu chấm tiền tố trong tên tập tin). Điều này ngăn máy quét phương tiện đọc tệp phương tiện của bạn và cung cấp cho các ứng dụng khác thông qua nhà cung cấp nội dung MediaStore. Tuy nhiên, nếu tệp của bạn thực sự là riêng tư đối với ứng dụng của bạn, bạn nên lưu chúng trong thư mục ứng dụng riêng tư.

Các vấn đề liên quan