Chọn bất kỳ loại tệp nào thông qua Intent trong Android


95

Tôi muốn bắt đầu một trình chọn ý định cho các ứng dụng có thể trả về bất kỳ loại tệp nào

Hiện tôi đang sử dụng (mà tôi đã sao chép từ mã nguồn email Android để đính kèm tệp)

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Intent i = Intent.createChooser(intent, "File");
startActivityForResult(i, CHOOSE_FILE_REQUESTCODE);

Nhưng nó chỉ hiển thị "Bộ sưu tập" và "Trình phát nhạc" trên Galaxy S2 của tôi. Có một trình khám phá tệp trên thiết bị này và tôi muốn nó xuất hiện trong danh sách. Tôi cũng muốn ứng dụng máy ảnh hiển thị trong danh sách để người dùng có thể chụp ảnh và gửi ảnh qua ứng dụng của tôi. Nếu tôi cài đặt trình quản lý tệp Astro, nó cũng sẽ đáp ứng ý định đó. Khách hàng của tôi chỉ là chủ sở hữu Galaxy SII và tôi không muốn buộc họ cài đặt trình quản lý tệp Astro vì họ đã có trình quản lý tệp cơ bản nhưng đủ.

Bất kỳ ý tưởng về cách tôi có thể đạt được điều này? Tôi khá chắc chắn rằng tôi đã thấy trình quản lý tệp mặc định xuất hiện trong menu như vậy để chọn tệp, nhưng tôi không thể nhớ trong ứng dụng nào.


Bạn sẽ cần mã rất khác nhau để chụp ảnh sau đó để chọn tệp. Tôi không thực sự nghĩ rằng hầu hết các trình khám phá tệp có thể trả lại một tệp, nhưng tôi có thể đã nhầm.
dtech

bạn có thể chỉ định loại tệp nào bạn cần được truy cập chủ yếu không?
subrussn90

1
@dtech: Tôi không mong đợi trình khám phá tệp trả lại tệp, tôi chỉ cần đường dẫn của nó.
ErGo_404

@ subrussn90: Tôi cần để người dùng chọn bất kỳ loại tệp nào. Nó có thể là pdf, .doc, .zip, BẤT KỲ loại tệp nào.
ErGo_404

là nó đủ để bạn nhận được Uri của tệp được chỉ định trên thẻ sd ???
subrussn90

Câu trả lời:


88

Không phải cho máy ảnh mà cho các tệp khác ..

Trong thiết bị của tôi, tôi đã ES File Explorercài đặt và Điều này đơn giản chỉ hoạt động trong trường hợp của tôi ..

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);

5
Nó hoạt động với trình khám phá tệp bên ngoài (chẳng hạn như ES File Explorer hoặc Astro File Manager, nhưng không hoạt động với trình khám phá tệp của Samsung. Có vẻ kỳ lạ là họ đã không triển khai các bộ lọc ý định chính xác để phản hồi lại hành động đó.
ErGo_404

@Lukap - Sử dụng trình quản lý tệp android mã nguồn mở và tích hợp nó với ứng dụng của bạn, sau đó bạn không cần bất kỳ ứng dụng bên thứ ba nào.
user370305

2
làm cách nào để lấy tệp đã chọn? Tôi đoán đó là con đường, nhưng làm thế nào?
Francisco Corrales Morales

1
@FranciscoCorralesMorales - in onActivityResult()- Bạn có thể lấy UriTệp.
user370305

1
PICKFILE_RESULT_CODEnên được PICKFILE_REQUEST_CODE.
Aron Lorincz

50

Trình thám hiểm tệp của Samsung không chỉ cần hành động tùy chỉnh ( com.sec.android.app.myfiles.PICK_DATA ), mà còn cả phần danh mục (Ý định. CATEGORY_DEFAULT ) và kiểu mime phải được chuyển thêm.

Intent intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
intent.putExtra("CONTENT_TYPE", "*/*");
intent.addCategory(Intent.CATEGORY_DEFAULT);

Bạn cũng có thể sử dụng hành động này để mở nhiều tệp: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE Dù sao đây là giải pháp của tôi hoạt động trên Samsung và các thiết bị khác:

public void openFile(String mimeType) {

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(mimeType);
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        // special intent for Samsung file manager
        Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
         // if you want any file type, you can skip next line 
        sIntent.putExtra("CONTENT_TYPE", mimeType); 
        sIntent.addCategory(Intent.CATEGORY_DEFAULT);

        Intent chooserIntent;
        if (getPackageManager().resolveActivity(sIntent, 0) != null){
            // it is device with Samsung file manager
            chooserIntent = Intent.createChooser(sIntent, "Open file");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { intent});
        } else {
            chooserIntent = Intent.createChooser(intent, "Open file");
        }

        try {
            startActivityForResult(chooserIntent, CHOOSE_FILE_REQUESTCODE);
        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(getApplicationContext(), "No suitable File Manager was found.", Toast.LENGTH_SHORT).show();
        }
    }

Giải pháp này hoạt động tốt đối với tôi và có thể sẽ hữu ích cho người khác.


Nó gần như hoạt động với tôi, ngoại trừ thực tế là sIntent, khi được khởi chạy, không chấp nhận bất kỳ loại tệp nào. Tôi có thể duyệt qua các thư mục, nhưng chỉ có vậy.
Radu

Vấn đề là ý định cần phải có mimeType: "tệp / *", trong khi sIntent của Samsung cần "* / *" - không có khoảng cách giữa * / *
Radu

1
Còn 11k thiết bị Android khác thì sao.
Oliver Dixon

1
Làm thế nào để đặt URI cho mục đích này, bạn có thể vui lòng giúp tôi không?
PriyankaChauhan

1
Trong trường hợp Samsung Intent ("com.sec.android.app.myfiles.PICK_DATA"), bạn có thể thử đặt thêm Chuỗi "FOLDERPATH" hoặc "START_FOLDER"
Chupik

41

công việc này đối với tôi trên galaxy note hiển thị danh bạ, trình quản lý tệp được cài đặt trên thiết bị, thư viện, máy nghe nhạc

private void openFile(Int  CODE) {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("*/*");
    startActivityForResult(intent, CODE);
}

ở đây nhận đường dẫn onActivityResulthoạt động.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     String Fpath = data.getDataString();
    // do somthing...
    super.onActivityResult(requestCode, resultCode, data);

}

6
Làm thế nào để chuyển đổi get uri thành use.File?
Anand Savjani

Bạn không chắc chắn về cách tải java.io.File, nhưng có thể mở bằng: developer.android.com/reference/android/content/… Cách lấy tên đơn giản tại đây: stackoverflow.com/a/23270545/755313
demaksee

3
làm thế nào để chọn một thư mục?
hornet2319

6

Điều này mang lại cho tôi kết quả tốt nhất:

    Intent intent;
    if (android.os.Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
        intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
        intent.putExtra("CONTENT_TYPE", "*/*");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
    } else {

        String[] mimeTypes =
                {"application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx
                        "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx
                        "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx
                        "text/plain",
                        "application/pdf",
                        "application/zip", "application/vnd.android.package-archive"};

        intent = new Intent(Intent.ACTION_GET_CONTENT); // or ACTION_OPEN_DOCUMENT
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
    }

Bạn có thể chia sẻ onActivityResultCode @Islam Khaled
Kishan Donga

1
Xem thêm org.openintents.action.PICK_FILE để biết tùy chọn thứ ba. openintents.org/action/org-openintents-action-pick-file Mã của bạn cũng giả định rằng mọi người trên điện thoại Samsung đều sử dụng và (vẫn) có trình quản lý tệp Samsung. Sử dụng ý định.resolveActivity với Samsung như một phương án dự phòng sẽ mạnh mẽ hơn.
Marcus Wolschon

1

Hóa ra trình khám phá tệp Samsung sử dụng một hành động tùy chỉnh. Đây là lý do tại sao tôi có thể thấy trình khám phá tệp Samsung khi tìm kiếm tệp từ các ứng dụng samsung, nhưng không thấy từ của tôi.

Hành động là "com.sec.android.app.myfiles.PICK_DATA"

Tôi đã tạo một Bộ chọn hoạt động tùy chỉnh hiển thị các hoạt động lọc cả hai ý định.


Xin chào, bạn có thể giải thích điều này một chút? Đối với điện thoại samsung galaxy, tôi sử dụng Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); nhưng nó gây ra một lỗi
steliosf

Tôi không chắc ngay bây giờ, nhưng tôi có thể kiểm tra nó sau. Tôi nghĩ đó là ngoại lệ Không tìm thấy Hoạt động. Bạn có bất kỳ giải pháp làm việc? Tôi gần như đã thử mọi thứ và không thể khắc phục được
steliosf

Ý định này đã phù hợp với tôi trên Galaxy SII. Đã thử nó trên GT-B5510 (Galaxy Y Pro) và nó không hoạt động. Tôi nghĩ rằng nó không đáng tin cậy nếu bạn muốn nhắm mục tiêu tất cả các thiết bị của Samsung. Tôi đã kết thúc việc tích hợp trình quản lý tệp nguồn mở vào ứng dụng của mình, nhưng nó là một giải pháp nặng nề cho nhu cầu cơ bản như vậy.
ErGo_404

Làm thế nào để đặt URI cho mục đích này, bạn có thể vui lòng giúp tôi không?
PriyankaChauhan

0

Nếu bạn muốn biết điều này, nó tồn tại một thư viện mã nguồn mở được gọi là aFileDialog , nó là một thư viện nhỏ và dễ sử dụng, cung cấp một bộ chọn tệp.

Sự khác biệt với các thư viện của trình chọn tệp khác cho Android là aFileDialog cung cấp cho bạn tùy chọn để mở trình chọn tệp dưới dạng Hộp thoại và dưới dạng Hoạt động.

Nó cũng cho phép bạn chọn thư mục, tạo tệp, lọc tệp bằng biểu thức chính quy và hiển thị hộp thoại xác nhận.


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.