2016-11-20 1 views
0

J'ai quelques problèmes avec les éléments suivants.Message non affiché lorsque le lecteur de pdf n'est pas installé

Lorsqu'un fichier est téléchargé, j'affiche une notification à l'utilisateur, quand il/elle tabs la notification, il recherche l'application correspondante (exemple de lecteur PDF) pour ouvrir le fichier avec.

Tout fonctionne quand j'affiche la notification mais quand aucun lecteur PDF n'est installé aucun message toast n'est affiché à l'utilisateur.

Quelqu'un pourrait m'aider s'il vous plaît? Je sais que le bloc try est vide car je ne sais pas exactement ce qu'il y a dedans pour invoquer le message toast.

Merci.

EDIT: Cela fonctionne quand je décommenter "context.startActivity (target);" mais cela démarre le processus ouvert automatiquement, il devrait commencer lorsque l'utilisateur tabule la notification.

Code de notification:

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()); 
     } 
code

pour ouvrir le fichier 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; 
    } 

Répondre

2

Vous ne devriez pas essayer de démarrer une activité, pour déterminer si elle existe. Au lieu de cela, vous pouvez vérifier avec PackageManager s'il existe une activité capable de gérer votre intention, sans la démarrer.

Essayez l'une des méthodes suivantes (elles sont toutes équivalentes):

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(); 
} 

ou:

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(); 
} 

ou:

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(); 
} 

Et au lieu d'annuler la notification openPdf vous pouvez simplement retourner null s'il n'y a pas d'application disponible et n'essayez pas de montrer la notification du tout.

+0

Thx Marcin, j'obtiens une erreur indiquant que resolveActivity (PackageManager) ne peut pas être appliqué à (PackageManager, int). J'ai placé votre code dans la méthode openPDF. (target.resolveActivity (pm, PackageManager.MATCH_DEFAULT_ONLY) == null) – Simon

+0

Oui, désolé. La méthode devrait être appelée le pm pas sur l'intention. J'ai mis à jour ma réponse. –

+0

Et comme plusieurs approches équivalentes sont mentionnées dans les réponses à des questions similaires, je viens de les énumérer toutes. –