首页 > 解决方案 > Android - 在通知上单击打开文件并按回不显示应用程序

问题描述

文件下载完成后显示本地通知

    String fileName = AppUtils.getFileNameFromUrlPath(download.getFile());
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mContext, channelId)
            .setSmallIcon(R.drawable.ic_fluxble_icon_primary)
            .setAutoCancel(true)
            .setContentTitle("Download Complete")
            .setContentText(fileName);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(mContext);
    File file = new File(download.getFile());
    Intent intent = AppUtils.getOpenApp(mContext, file);
    stackBuilder.addNextIntent(intent);
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(resultPendingIntent);
    notificationManager.notify(notificationId, mBuilder.build());

在通知上单击我打开/显示该文件或者图像/文档等给用户。

    public static Intent getOpenApp(Context context, File url) {
    Intent intent = null;
    try {
        Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", url);
        intent = new Intent(Intent.ACTION_VIEW);
        if (url.toString().contains(".doc") || url.toString().contains(".docx")) {
            // Word document
            intent.setDataAndType(uri, "application/msword");
        } else if (url.toString().contains(".pdf")) {
            // PDF file
            intent.setDataAndType(uri, "application/pdf");
        } else if (url.toString().contains(".ppt") || url.toString().contains(".pptx")) {
            // Powerpoint file
            intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
        } else if (url.toString().contains(".xls") || url.toString().contains(".xlsx")) {
            // Excel file
            intent.setDataAndType(uri, "application/vnd.ms-excel");
        } else if (url.toString().contains(".zip")) {
            // ZIP file
            intent.setDataAndType(uri, "application/zip");
        } else if (url.toString().contains(".rar")) {
            // RAR file
            intent.setDataAndType(uri, "application/x-rar-compressed");
        } else if (url.toString().contains(".rtf")) {
            // RTF file
            intent.setDataAndType(uri, "application/rtf");
        } else if (url.toString().contains(".wav") || url.toString().contains(".mp3")) {
            // WAV audio file
            intent.setDataAndType(uri, "audio/x-wav");
        } else if (url.toString().contains(".gif")) {
            // GIF file
            intent.setDataAndType(uri, "image/gif");
        } else if (url.toString().contains(".jpg") || url.toString().contains(".jpeg") || url.toString().contains(".png")) {
            // JPG file
            intent.setDataAndType(uri, "image/jpeg");
        } else if (url.toString().contains(".txt")) {
            // Text file
            intent.setDataAndType(uri, "text/plain");
        } else if (url.toString().contains(".3gp") || url.toString().contains(".mpg") ||
                url.toString().contains(".mpeg") || url.toString().contains(".mpe") || url.toString().contains(".mp4") || url.toString().contains(".avi")) {
            // Video files
            intent.setDataAndType(uri, "video/*");
        } else {
            intent.setDataAndType(uri, "*/*");
        }
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    } catch (ActivityNotFoundException e) {
        AppUtils.showSnackbar((Activity) context, "No application found which can open the file");
    }
    return intent;
}

哪个工作正常。当我单击通知时,它会按 Intent.ACTION_VIEW 意图显示图像,但是当我单击返回按钮时,它不会返回到我的应用程序,而是返回到移动桌面屏幕。我的应用程序进入暂停/最小化模式。

标签: androidandroid-intentandroid-notificationsandroid-pendingintent

解决方案


现在很清楚问题是什么。您正在构建一个Intent以使用隐式意图 (ACTION = VIEW) 查看文档并将其放入Notification. 当用户打开Notification并点击它时,Intent您构建的 就会启动。这不会启动您的应用程序,它会启动用户查看文件所需的任何应用程序。您的应用甚至不需要运行。

当用户单击 BACK 时,它只是转到主屏幕,因为您的应用程序没有启动查看器,Android 启动了。

如果您希望用户返回您的应用程序,您需要以不同的方式执行此操作。应该启动您的Notification应用程序,然后您的应用程序应该启动 VIEWer 应用程序。然后,当用户返回时,他将看到您的应用程序。


推荐阅读