Как исправить ошибку, при которой содержимое не отображается при открытии файла с использованием намерения?

#android #file #android-intent

#Android #файл #android-намерение

Вопрос:

Я хочу программно отобразить файл, используя intent, в другом приложении, например, в программе просмотра pdf. Но ни одно приложение не может разрешить содержимое файла и показать сообщение об ошибке или немедленно закрыть. Я думаю, что мое приложение не будет правильно отправлять содержимое файла, поэтому другие приложения не могут отобразить файл.

Я искал решение, но нашел только комментарии и сообщения, где проблема заключается в открытии файла. Но это не моя проблема.

Вот мой код (на самом деле не мой, я получил его с другого сайта), чтобы открыть файл:

         MimeTypeMap myMime = MimeTypeMap.getSingleton();
        Intent intent = new Intent(Intent.ACTION_VIEW);
        String mimeType = myMime.getMimeTypeFromExtension(filetype);
        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Uri fileURI = FileProvider.getUriForFile(getContext(),
                    BuildConfig.APPLICATION_ID   ".fileprovider",file);
            intent.setDataAndType(fileURI, mimeType);

        } else {
            intent.setDataAndType(Uri.fromFile(file), mimeType);
         }
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_GRANT_READ_URI_PERMISSION);
        try {
            getContext().startActivity(intent);
        }catch (ActivityNotFoundException e){
            Toast.makeText(getContext(), "No Application found to open this type of file.", Toast.LENGTH_LONG).show();
        }
  

String-var ‘filetype’ — это расширение / тип файла, например, «pdf» или «txt», и получение правильного mimetype не является проблемой.
Файловый объект «file» — это мой файл, который я создал таким образом:

 File openFile = new File("MY_PATH");
  

Проблем также нет.

Итак, где ошибка, или у кого-нибудь есть код получше, или вы могли бы опубликовать ссылку на хороший блог / stack-overflow-post или что-то еще, связанное с моей темой? Спасибо заранее!

Комментарии:

1. вы добавили своего поставщика контента в манифест?

2. Да, я это сделал. И [BuildConfig. APPLICATION_ID «.fileprovider»] правильно.

Ответ №1:

Я использую этот код для обмена изображениями, надеюсь, это поможет:

     private const val IMAGE_FORMAT = "image/jpg"

  override fun shareFile(file: File) {
     if (context != null) {
        val contentUri = FileProvider.getUriForFile(context!!, FileManager.PROVIDER, file)

        val intent = Intent(Intent.ACTION_SEND)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        intent.type = IMAGE_FORMAT
        intent.putExtra(Intent.EXTRA_STREAM, contentUri)

        startActivity(Intent.createChooser(intent, getString(R.string.share_via)))
    }
}
  

FileManager.PROVIDER в вашем случае это строка поставщика BuildConfig.APPLICATION_ID ".fileprovider"

Комментарии:

1. Спасибо за ваш ответ. Я попробую этот код и дам вам отзыв, работает ли он: D

2. Я пытался, но безуспешно. Возможно ли, что я создаю файловый объект неправильно??