เลือกไฟล์ประเภทใดก็ได้ผ่าน Intent ใน Android


98

ฉันต้องการเริ่มตัวเลือกเจตนาสำหรับแอปที่สามารถส่งคืนไฟล์ประเภทใดก็ได้

ตอนนี้ฉันใช้ (ซึ่งฉันคัดลอกมาจากซอร์สโค้ดอีเมล Android สำหรับไฟล์แนบ)

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

แต่จะแสดงเฉพาะ "แกลเลอรี" และ "เครื่องเล่นเพลง" ใน Galaxy S2 ของฉัน มี file explorer บนอุปกรณ์นี้และฉันต้องการให้มันปรากฏในรายการ ฉันต้องการให้แอพกล้องแสดงในรายการเพื่อให้ผู้ใช้สามารถถ่ายภาพและส่งผ่านแอพของฉันได้ หากฉันติดตั้งโปรแกรมจัดการไฟล์ Astro มันก็จะตอบสนองต่อเจตนานั้นเช่นกัน ลูกค้าของฉันเป็นเจ้าของ Galaxy SII เท่านั้นและฉันไม่ต้องการบังคับให้พวกเขาติดตั้งตัวจัดการไฟล์ Astro เนื่องจากพวกเขามีตัวจัดการไฟล์พื้นฐาน แต่เพียงพอแล้ว

มีความคิดว่าฉันจะบรรลุเป้าหมายนี้ได้อย่างไร? ฉันค่อนข้างมั่นใจว่าฉันเห็นตัวจัดการไฟล์เริ่มต้นปรากฏในเมนูเพื่อเลือกไฟล์ แต่ฉันจำไม่ได้ว่าอยู่ในแอปใด


คุณจะต้องใช้รหัสที่แตกต่างกันมากในการถ่ายภาพจากนั้นจึงจะเลือกไฟล์ได้ ฉันไม่คิดว่านักสำรวจไฟล์ส่วนใหญ่สามารถส่งคืนไฟล์ได้ แต่ฉันอาจคิดผิด
dtech

คุณระบุได้ไหมว่าต้องการเข้าถึงไฟล์ประเภทใดเป็นหลัก
subrussn90

1
@dtech: ฉันไม่คาดหวังว่า file explorer จะส่งคืนไฟล์ฉันต้องการแค่เส้นทางเท่านั้น
ErGo_404

@ subrussn90: ฉันต้องการให้ผู้ใช้เลือกไฟล์ประเภทใดก็ได้ อาจเป็นไฟล์ PDF, .doc, .zip, ไฟล์ประเภทใดก็ได้
ErGo_404

เพียงพอหรือไม่ที่คุณจะได้รับ Uri ของไฟล์ที่ระบุใน sd card ???
subrussn90

คำตอบ:


89

ไม่ใช่สำหรับกล้อง แต่สำหรับไฟล์อื่น ๆ ..

ในอุปกรณ์ของฉันฉันได้ES File Explorerติดตั้งและสิ่งนี้ใช้ได้ในกรณีของฉัน ..

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

5
มันทำงานร่วมกับโปรแกรมสำรวจไฟล์ภายนอก (เช่น ES File Explorer หรือ Astro File Manager แต่ไม่ใช่กับ Samsung file explorer ดูเหมือนจะแปลกที่พวกเขาไม่ได้ใช้ตัวกรองเจตนาที่ถูกต้องเพื่อตอบสนองต่อการกระทำนั้น
ErGo_404

@Lukap - ใช้โปรแกรมจัดการไฟล์ Android แบบโอเพนซอร์สและรวมเข้ากับแอปพลิเคชันของคุณจากนั้นคุณไม่จำเป็นต้องมีแอปพลิเคชันของบุคคลที่สาม
user370305

2
ฉันจะรับไฟล์ที่เลือกได้อย่างไร ฉันเดาว่ามันเป็นเส้นทาง แต่อย่างไร
Francisco Corrales Morales

1
@FranciscoCorralesMorales - ในonActivityResult()- คุณจะได้รับUriจากไฟล์
user370305

1
PICKFILE_RESULT_CODEPICKFILE_REQUEST_CODEควรจะเป็น
Aron Lorincz

50

Samsung file explorer ไม่เพียงต้องการการดำเนินการแบบกำหนดเอง ( com.sec.android.app.myfiles.PICK_DATA ) แต่ยังต้องส่งผ่านหมวดหมู่ (Intent. CATEGORY_DEFAULT ) และประเภท mime เป็นพิเศษ

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

คุณยังสามารถใช้การกระทำนี้เพื่อเปิดไฟล์หลาย ๆ ไฟล์: com.sec.android.app.myfiles.PICK_DATA_MULTIPLE อย่างไรก็ตามนี่คือโซลูชันของฉันที่ใช้ได้กับ Samsung และอุปกรณ์อื่น ๆ :

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

วิธีนี้ใช้ได้ดีสำหรับฉันและอาจเป็นประโยชน์สำหรับคนอื่น


เกือบจะใช้ได้สำหรับฉันยกเว้นความจริงที่ว่า sIntent เมื่อเปิดตัวจะไม่ยอมรับไฟล์ประเภทใด ๆ ฉันสามารถเรียกดูโฟลเดอร์ได้ แต่ก็แค่นั้น
Radu

ปัญหาคือความตั้งใจจะต้องมี mimeType: "file / *" ในขณะที่ Samsung sIntent ต้องการ "* / *" - โดยไม่ต้องเว้นวรรคระหว่าง * / *
Radu

1
แล้วอุปกรณ์ Android อื่น ๆ อีก 11k
Oliver Dixon

1
วิธีตั้งค่า URI สำหรับจุดประสงค์นี้โปรดช่วยฉันด้วย
PriyankaChauhan

1
ในกรณีของ Samsung Intent ("com.sec.android.app.myfiles.PICK_DATA") คุณสามารถลองใส่ String พิเศษ "FOLDERPATH" หรือ "START_FOLDER"
Chupik

42

งานนี้สำหรับฉันใน galaxy สังเกตรายชื่อการแสดงผู้จัดการไฟล์ที่ติดตั้งในอุปกรณ์แกลเลอรี่เครื่องเล่นเพลง

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

ที่นี่รับเส้นทางในonActivityResultกิจกรรม

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

}

6
วิธีการแปลงการรับ uri เป็น util.File?
Anand Savjani

ไม่แน่ใจเกี่ยวกับการรับ java.io.File แต่สามารถเปิดได้ด้วย: developer.android.com/reference/android/content/…วิธีรับชื่อง่ายๆอยู่ที่นี่: stackoverflow.com/a/23270545/755313
demaksee

3
วิธีเลือกโฟลเดอร์
hornet2319

9

สิ่งนี้ทำให้ฉันได้ผลลัพธ์ที่ดีที่สุด:

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

คุณสามารถแบ่งปันของคุณ onActivityResultCode @Islam Khaled
Kishan Donga

1
โปรดดูที่ org.openintents.action.PICK_FILE สำหรับตัวเลือกที่สาม openintents.org/action/org-openintents-action-pick-file รหัสของคุณยังถือว่าทุกคนในโทรศัพท์ Samsung ใช้และ (ยัง) มีตัวจัดการไฟล์ Samsung การใช้ Intent.resolveActivity กับ Samsung เป็นทางเลือกจะมีประสิทธิภาพมากขึ้น
Marcus Wolschon

1

ปรากฎว่า Samsung file explorer ใช้การดำเนินการแบบกำหนดเอง นี่คือเหตุผลที่ฉันเห็น Samsung file explorer เมื่อค้นหาไฟล์จากแอพ samsung แต่ไม่ใช่จากของฉัน

การดำเนินการคือ "com.sec.android.app.myfiles.PICK_DATA"

ฉันสร้างตัวเลือกกิจกรรมที่กำหนดเองซึ่งจะแสดงกิจกรรมที่กรองทั้งสองเจตนา


สวัสดีคุณช่วยอธิบายเรื่องนี้อีกหน่อยได้ไหม สำหรับโทรศัพท์ samsung galaxy ฉันใช้ Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); แต่มันทำให้เกิดข้อผิดพลาด
steliosf

ตอนนี้ยังไม่แน่ใจ แต่สามารถตรวจสอบได้ในภายหลัง ฉันคิดว่ามันเป็นข้อยกเว้นของ Activity Not Found คุณมีวิธีแก้ปัญหาในการทำงานหรือไม่? ฉันเกือบจะลองทุกอย่างแล้วและไม่สามารถแก้ไขได้
steliosf

ความตั้งใจนี้ใช้ได้ผลกับฉันใน Galaxy SII ลองใช้ GT-B5510 (Galaxy Y Pro) แล้วไม่ได้ผล ฉันคิดว่ามันไม่น่าเชื่อถือถ้าคุณต้องการกำหนดเป้าหมายอุปกรณ์ Samsung ทั้งหมด ฉันลงเอยด้วยการรวมตัวจัดการไฟล์โอเพ่นซอร์สเข้ากับแอปพลิเคชันของฉัน แต่มันเป็นวิธีแก้ปัญหาที่หนักสำหรับความต้องการพื้นฐานเช่นนี้
ErGo_404

วิธีตั้งค่า URI สำหรับจุดประสงค์นี้โปรดช่วยฉันด้วย
PriyankaChauhan

0

หากคุณต้องการทราบสิ่งนี้มีไลบรารีโอเพ่นซอร์สชื่อaFileDialogซึ่งมีขนาดเล็กและใช้งานง่ายซึ่งมีตัวเลือกไฟล์

ความแตกต่างกับไลบรารีของตัวเลือกไฟล์อื่นสำหรับ Android คือ aFileDialog ช่วยให้คุณมีตัวเลือกในการเปิดตัวเลือกไฟล์เป็นกล่องโต้ตอบและเป็นกิจกรรม

นอกจากนี้ยังช่วยให้คุณสามารถเลือกโฟลเดอร์สร้างไฟล์กรองไฟล์โดยใช้นิพจน์ทั่วไปและแสดงกล่องโต้ตอบการยืนยัน


0

คำตอบอื่น ๆ ไม่ถูกต้อง อย่างไรก็ตามตอนนี้มีตัวเลือกเพิ่มเติมสำหรับการเปิดไฟล์ ตัวอย่างเช่นหากคุณต้องการให้แอปมีการเข้าถึงไฟล์ในระยะยาวคุณสามารถใช้ACTION_OPEN_DOCUMENTแทนได้ อ้างถึงเอกสารอย่างเป็นทางการ: เปิดไฟล์โดยใช้กรอบการเข้าถึงที่เก็บข้อมูลเปิดไฟล์โดยใช้กรอบเข้าถึงที่จัดเก็บนอกจากนี้ยังอ้างถึงคำตอบนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.