2016-11-20 4 views
0

私は以下にいくつか問題があります。pdfリーダーがインストールされていないときにメッセージが表示されない

ファイルがダウンロードされると、ユーザーに通知が表示されます。通知をタブすると、該当するアプリケーション(PDFリーダーなど)がファイルを開くために検索されます。

通知をタブすると機能が動作しますが、PDFリーダーがインストールされていない場合メッセージが表示されないはユーザーに表示されます。

誰かが私を助けてくれますか?私はトーストメッセージを呼び出すためにそこに来るものが正確にわからないので、tryブロックが空であることを知っています。

ありがとうございます。

EDIT:「context.startActivity(target);」のコメントを外すと機能します。これは自動的にオープンプロセスを開始します。ユーザが通知にタブを当てたときに開始されます。

通知コード:あなたはそれが存在するかどうかを判断するために活動を開始しようとするべきではありません

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

答えて

2

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ファイルを開きます。代わりに、起動しなくてもIntentを処理できるActivityがある場合は、PackageManagerで確認できます。

(彼らはすべて同じです)次のいずれかの方法を試してみてください。

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に通知をキャンセル利用可能なアプリがない場合はnullを返すだけです通知をまったく表示しようとしないでください。

+0

Thx Marcin、resolveActivity(PackageManager)を(PackageManager、int)に適用できないというエラーが表示されます。 あなたのコードをopenPDFメソッドに入れました。 (target.resolveActivity(pm、PackageManager.MATCH_DEFAULT_ONLY)== null) – Simon

+0

はい、申し訳ありません。このメソッドはインテントではなくpmで呼び出す必要があります。私は自分の答えを更新しました。 –

+0

同様の質問に対する答えには、いくつかの同等のアプローチが記載されているので、私はそれらをすべてリストアップしました。 –

関連する問題