Виберіть будь-який файл за допомогою Інтенції в Android


95

Я хотів би запустити програму вибору програми для програм, які можуть повернути будь-який файл

В даний час я використовую (який я скопіював із вихідного коду електронної пошти 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. На цьому пристрої є програма для перегляду файлів, і я хотів би, щоб він відобразився у списку. Я також хотів би, щоб додаток камери відображався у списку, щоб користувач міг зняти зображення та надіслати його через мій додаток. Якщо я встановлю файловий менеджер Astro, він відповість і на цей намір. Мої клієнти є лише власниками Galaxy SII, і я не хочу змушувати їх встановлювати файловий менеджер Astro, оскільки вони вже мають базовий, але достатній файловий менеджер.

Будь-яке уявлення про те, як я міг цього досягти? Я майже впевнений, що я вже бачив, як у такому меню з'являється менеджер файлів за замовчуванням, щоб вибрати файл, але я не можу згадати, в якому додатку.


Вам знадобиться зовсім інший код, щоб зняти картинку, а потім вибрати файл. Я насправді не думаю, що більшість дослідників файлів можуть повернути файл, але я можу помилитися.
dtech

Ви можете вказати, до якого типу файлів потрібно отримати доступ перш за все?
subrussn90

1
@dtech: Я не сподіваюся, що програма перевірки файлів поверне файл, мені потрібен лише шлях.
ErGo_404

@ subrussn90: мені потрібно дозволити користувачу вибрати будь-який файл. Це може бути файл pdfs, .doc, .zip, будь-який файл.
ErGo_404

чи достатньо, щоб ви отримали Uri вказаного файлу на sd-картці ???
subrussn90

Відповіді:


88

Не для камери, а для інших файлів ..

На своєму пристрої я 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. Здається дивним, що вони не застосували правильні фільтри намірів, щоб відповісти на цю дію.
ErGo_404,

@Lukap - Використовуйте диспетчер файлів з відкритим кодом для Android та інтегруйте його зі своїм додатком, тоді вам не потрібна додаткова програма сторонніх розробників.
user370305

2
як я можу отримати вибраний файл? Я здогадуюсь це шлях, але як?
Франциско Корралес Моралес

1
@FranciscoCorralesMorales - в onActivityResult()- Ви можете отримати Uriфайл.
user370305

1
PICKFILE_RESULT_CODEповинно бути PICKFILE_REQUEST_CODE.
Арон Лорінц

50

Досліднику файлів Samsung потрібні не тільки спеціальні дії ( 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 при запуску не приймає жодного файлу будь-якого типу. Я можу переглядати папки, але це все.
Раду

Проблема полягає в тому, що намір повинен мати mimeType: "файл / *", тоді як Samsung sIntent потребує "* / *" - без пробілів між * / *
Раду,

1
А як щодо інших 11 тис. Пристроїв Android.
Олівер Діксон,

1
Як встановити URI для цього наміру, ви можете мені допомогти?
PriyankaChauhan

1
У випадку Samsung Intent ("com.sec.android.app.myfiles.PICK_DATA"), ви можете спробувати поставити String додатково "FOLDERPATH" або "START_FOLDER"
Чупік,

41

ця робота для мене на галактиці відзначає його шоу-контакти, файлові менеджери, встановлені на пристрої, галереї, музичному плеєрі

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?
Ананд Савяні

Не впевнений , що про отримання java.io.File, але може бути відкритий: developer.android.com/reference/android/content / ... Як отримати просте ім'я тут: stackoverflow.com/a/23270545/755313
demaksee

3
як вибрати папку?
hornet2319

6

Це дає мені найкращий результат:

    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 в якості резервної системи було б більш надійним.
Маркус Волшон

1

Виявляється, програма для перевірки файлів Samsung використовує власну дію. Ось чому я міг бачити провідник файлів Samsung, шукаючи файл із програм Samsung, але не з моїх.

Дія - "com.sec.android.app.myfiles.PICK_DATA"

Я створив спеціальний інструмент вибору активності, який відображає дії, фільтруючі обидва наміри.


Привіт, ти можеш пояснити це трохи більше? Для телефонів Samsung Galaxy я використовую Intent selectFile = new Intent ("com.sec.android.app.myfiles.PICK_DATA"); але це спричиняє помилку
steliosf

Зараз я не впевнений, але це можу перевірити пізніше. Я думаю, що це виключення "Не знайдено". У вас є якесь робоче рішення? Я майже спробував усе, і не вдалося це виправити
steliosf

Цей намір спрацював для мене на Galaxy SII. Спробував це на GT-B5510 (Galaxy Y Pro), і це не спрацювало. Я думаю, що це просто не є надійним, якщо ви хочете націлити всі пристрої Samsung. Я закінчив інтегрувати менеджер файлів з відкритим кодом у свою програму, але це важке рішення для такої основної потреби.
ErGo_404

Як встановити URI для цього наміру, ви можете мені допомогти?
PriyankaChauhan

0

Якщо ви хочете знати це, існує бібліотека з відкритим кодом під назвою aFileDialog, що це невелика і проста у використанні, яка забезпечує вибір файлів.

Відмінність бібліотек іншого вибору файлів для Android полягає в тому, що aFileDialog надає вам можливість відкривати програму вибору файлів як Діалог і як Діяльність.

Він також дозволяє вибирати папки, створювати файли, фільтрувати файли за допомогою регулярних виразів та показувати діалогові вікна підтвердження.


0

Інші відповіді невірні. Однак зараз є більше варіантів відкриття файлів. Наприклад, якщо ви хочете, щоб програма мала тривалий та постійний доступ до файлу, ви можете використовувати це ACTION_OPEN_DOCUMENTзамість цього. Зверніться до офіційної документації: Відкрийте файли, використовуючи рамки доступу для зберігання . Також зверніться до цієї відповіді .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.