Я хотел бы запустить средство выбора для приложений, которые могут возвращать любой файл
В настоящее время я использую (который я скопировал из исходного кода электронной почты 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, поскольку у них уже есть базовый, но достаточный файловый менеджер.
Есть идеи, как я мог этого добиться? Я почти уверен, что уже видел, как в таком меню появлялся файловый менеджер по умолчанию, чтобы выбрать файл, но я не могу вспомнить, в каком приложении.
источник
Ответы:
Не для камеры, а для других файлов ..
В моем устройстве я
ES File Explorer
установил, и это просто работает в моем случае ..Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("file/*"); startActivityForResult(intent, PICKFILE_REQUEST_CODE);
источник
onActivityResult()
- Вы можете получитьUri
из файла.PICKFILE_RESULT_CODE
должно бытьPICKFILE_REQUEST_CODE
.Проводнику 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(); } }
Это решение мне подходит, а может быть, кому-то пригодится.
источник
эта работа для меня в галактике, обратите внимание, что на нем показаны контакты, файловые менеджеры, установленные на устройстве, галерея, музыкальный проигрыватель
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); }
источник
Это дает мне лучший результат:
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); }
источник
Оказывается, файловый менеджер Samsung использует настраиваемое действие. Вот почему я мог видеть файловый менеджер Samsung при поиске файла в приложениях Samsung, но не в моем.
Действие: com.sec.android.app.myfiles.PICK_DATA.
Я создал настраиваемое средство выбора действий, которое отображает действия, фильтрующие оба намерения.
источник
Если вы хотите знать это, существует библиотека с открытым исходным кодом под названием aFileDialog , небольшая и простая в использовании, которая предоставляет средство выбора файлов.
Отличие от других библиотек выбора файлов для Android заключается в том, что aFileDialog дает вам возможность открывать средство выбора файлов как диалоговое окно и как действие.
Он также позволяет вам выбирать папки, создавать файлы, фильтровать файлы с помощью регулярных выражений и показывать диалоговые окна подтверждения.
источник
Остальные ответы не неверны. Однако теперь есть больше возможностей для открытия файлов. Например, если вы хотите, чтобы приложение имело долгосрочный постоянный доступ к файлу, вы можете использовать
ACTION_OPEN_DOCUMENT
вместо этого. См. Официальную документацию: Открытие файлов с помощью структуры доступа к хранилищу . Также обратитесь к этому ответу .источник