未安装 pdf reader 时不显示消息
Message not displayed when pdf reader not installed
我遇到以下问题。
下载文件后,我会向用户显示通知,当 he/she 点按通知时,它会搜索适用的应用程序(例如 PDF reader)以打开文件。
当我点击通知但没有安装 PDF reader 时,一切正常没有向用户显示 toast 消息。
有人可以帮助我吗?我知道 try 块是空的,因为我不知道其中有什么可以调用 toast 消息。
谢谢。
编辑: 当我取消注释 "context.startActivity(target);" 时它起作用但是这会自动启动打开过程,它应该在用户点击通知时启动。
通知代码:
if (file.getName().endsWith(".pdf")) {
Intent install = openPdf(urlPath, context, mNotificationManager,
NOTIFYCATIONID);
PendingIntent pending = PendingIntent.getActivity(context, 0, install, 0);
mBuilder = new NotificationCompat.Builder(context)
.setContentTitle(appName)
.setContentText("ready to open pdf.");
mBuilder.setContentIntent(pending);
mBuilder.setSmallIcon(R.drawable.placeholder);
mBuilder.setDefaults(Notification.DEFAULT_SOUND);
mBuilder.setAutoCancel(true);
mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify((int) System.currentTimeMillis(), mBuilder.build());
}
打开 PDF 文件的代码:
public static Intent openPdf(String urlPath, Context context,
NotificationManager mNotificationManager, int NOTIFYCATIONID) {
File file = new File(urlPath);
MimeTypeMap mime = MimeTypeMap.getSingleton();
String ext = file.getName().substring(file.getName().lastIndexOf(".")+1);
String type = mime.getMimeTypeFromExtension(ext).toLowerCase();;
Intent target = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
target.setDataAndType(Uri.fromFile(file), type);
target.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
try {
//context.startActivity(target);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "No application found to open PDF, please install one.", Toast.LENGTH_SHORT).show();
}
mNotificationManager.cancel(NOTIFYCATIONID);
return target;
}
您不应该尝试启动 Activity 来确定它是否存在。相反,您可以检查 PackageManager 是否有 Activity 可以处理您的 Intent,而无需启动它。
尝试以下方法之一(它们都是等效的):
PackageManager pm = context.getPackageManager();
if (pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) == null) {
Toast.makeText(context, "No application found to open PDF, please install one.", Toast.LENGTH_SHORT).show();
}
或:
PackageManager pm = context.getPackageManager();
if (intent.resolveActivity(pm) == null) {
Toast.makeText(context, "No application found to open PDF, please install one.", Toast.LENGTH_SHORT).show();
}
或:
PackageManager pm = context.getPackageManager();
if (pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) == 0) {
Toast.makeText(context, "No application found to open PDF, please install one.", Toast.LENGTH_SHORT).show();
}
而不是在 openPdf
中取消通知,如果没有可用的应用程序,您可以简单地 return null
并且根本不尝试显示通知。
我遇到以下问题。
下载文件后,我会向用户显示通知,当 he/she 点按通知时,它会搜索适用的应用程序(例如 PDF reader)以打开文件。
当我点击通知但没有安装 PDF reader 时,一切正常没有向用户显示 toast 消息。
有人可以帮助我吗?我知道 try 块是空的,因为我不知道其中有什么可以调用 toast 消息。
谢谢。
编辑: 当我取消注释 "context.startActivity(target);" 时它起作用但是这会自动启动打开过程,它应该在用户点击通知时启动。
通知代码:
if (file.getName().endsWith(".pdf")) {
Intent install = openPdf(urlPath, context, mNotificationManager,
NOTIFYCATIONID);
PendingIntent pending = PendingIntent.getActivity(context, 0, install, 0);
mBuilder = new NotificationCompat.Builder(context)
.setContentTitle(appName)
.setContentText("ready to open pdf.");
mBuilder.setContentIntent(pending);
mBuilder.setSmallIcon(R.drawable.placeholder);
mBuilder.setDefaults(Notification.DEFAULT_SOUND);
mBuilder.setAutoCancel(true);
mNotificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify((int) System.currentTimeMillis(), mBuilder.build());
}
打开 PDF 文件的代码:
public static Intent openPdf(String urlPath, Context context,
NotificationManager mNotificationManager, int NOTIFYCATIONID) {
File file = new File(urlPath);
MimeTypeMap mime = MimeTypeMap.getSingleton();
String ext = file.getName().substring(file.getName().lastIndexOf(".")+1);
String type = mime.getMimeTypeFromExtension(ext).toLowerCase();;
Intent target = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
target.setDataAndType(Uri.fromFile(file), type);
target.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
try {
//context.startActivity(target);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "No application found to open PDF, please install one.", Toast.LENGTH_SHORT).show();
}
mNotificationManager.cancel(NOTIFYCATIONID);
return target;
}
您不应该尝试启动 Activity 来确定它是否存在。相反,您可以检查 PackageManager 是否有 Activity 可以处理您的 Intent,而无需启动它。
尝试以下方法之一(它们都是等效的):
PackageManager pm = context.getPackageManager();
if (pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) == null) {
Toast.makeText(context, "No application found to open PDF, please install one.", Toast.LENGTH_SHORT).show();
}
或:
PackageManager pm = context.getPackageManager();
if (intent.resolveActivity(pm) == null) {
Toast.makeText(context, "No application found to open PDF, please install one.", Toast.LENGTH_SHORT).show();
}
或:
PackageManager pm = context.getPackageManager();
if (pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) == 0) {
Toast.makeText(context, "No application found to open PDF, please install one.", Toast.LENGTH_SHORT).show();
}
而不是在 openPdf
中取消通知,如果没有可用的应用程序,您可以简单地 return null
并且根本不尝试显示通知。