1

Мое приложение загружает файл из Интернета и сохраняет его в папку «Загрузки», а также предоставляет уведомление, этот файл был загружен. Когда я нажимаю уведомление, я создал chooserIntent, чтобы выбрать приложение, чтобы открыть файл. Тем не менее, любое приложение, которое я выбираю, не откроет файл с сообщением об ошибке: «Невозможно открыть файл», но когда я иду в диспетчер файлов, он открывается нормально. Думаю, это связано с разрешениями? BTW, Uri получается так (Android 7.1):Android: Не удается открыть загруженный файл из уведомления. Ошибка: «Не удается открыть файл»

Uri fileUri = FileProvider.getUriForFile(getActivityContext(), getAppContext().getPackageName() + ".provider", file); 

Вот мой код для уведомления:

private Notification downloadCompleteNotification(String title, String message, Uri uri) { 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.setDataAndType(uri, "*/*"); 
    Intent chooser = Intent.createChooser(intent, getResources().getString(R.string.open_file_with)); 
    NotificationCompat.Builder builder = initBasicBuilder(title, message, intent); 
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_u)); 
    builder.setOngoing(false); 

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, chooser, 0); 
    builder.setContentIntent(pendingIntent); 
    return builder.build(); 
} 

private NotificationCompat.Builder initBasicBuilder(String title, String text, Intent intent) { 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
    builder.setSmallIcon(R.drawable.u) 
      .setContentTitle(title) 
      .setContentText(text); 
    if (intent != null) { 
     TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this); 
     taskStackBuilder.addNextIntentWithParentStack(intent); 
    } 
    return builder; 
} 
+0

Ваша версия для Android? –

+0

Как я уже сказал: android 7.1. – Sermilion

+0

О, я пропустил это. Вы дали разрешение READ_EXTERNAL_STORAGE? –

ответ

0

Поместите этот код в OnCreate метод деятельности. Вы можете добавить несколько разрешения здесь разделенным запятыми

int PERMISSION_ALL = 1; 
     String[] PERMISSIONS = {android.Manifest.permission.READ_EXTERNAL_STORAGE}; 

     if(!hasPermissions(this, PERMISSIONS)){ 
      ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL); 
     } 

И добавить эту функцию:

public static boolean hasPermissions(Context context, String... permissions) { 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
      for (String permission : permissions) { 
       if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { 
        return false; 
       } 
      } 
     } 
     return true; 
    } 
0

Если вы используете API level 23 или выше. Вы должны дать разрешение Run Time. Также как внутри файла манифеста.

private static final int REQUEST_EXTERNAL_STORAGE = 1; 
private static String[] PERMISSIONS_STORAGE = { 
    Manifest.permission.READ_EXTERNAL_STORAGE, 
    Manifest.permission.WRITE_EXTERNAL_STORAGE 
}; 


private boolean checkPermissions() { 
     int result; 
     List<String> listPermissionsNeeded = new ArrayList<>(); 
     for (String p : PERMISSIONS_STORAGE) { 
      result = ContextCompat.checkSelfPermission(mContext, p); 
      if (result != PackageManager.PERMISSION_GRANTED) { 
       listPermissionsNeeded.add(p); 
      } 
     } 
     if (!listPermissionsNeeded.isEmpty()) { 
      ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_EXTERNAL_STORAGE); 
      return false; 
     } 
     return true; 
    } 

@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case REQUEST_EXTERNAL_STORAGE: 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // Permission granted. 
       } else { 
        //code for deny 
       } 
       break; 
     } 
    } 
+0

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

Смежные вопросы