2

私のアクティビティでファイルをダウンロードし、その後Intent.ACTION_VIEWを送信して開く必要があります。ダウンロード自体はうまく動作し、後でダウンロードセクションにアクセスできます。 Intent.ACTION_VIEWの代わりにDownloadManager.ACTION_VIEW_DOWNLOADSインテントを使用している場合は、正常に動作します。BroadcastReceiver内からIntent.ACTION_VIEWを起動しようとするとAndroidのアクティビティがクラッシュする

ただし、Intent.ACTION_VIEWを使用すると、アクティビティがクラッシュします。あなたが見ることができるように

public class RESTTestDownloadActivity extends SOFAActivity { 

private DownloadManager downloadManager; 
private IntentFilter downloadFilter; 
private BroadcastReceiver downloadReceiver; 
private long downloadID; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 

    setTitle("RESTTestDownloadActivity"); 

    downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 

    TestGetAttachment(); 
} 

private void TestGetAttachment(){ 

    downloadFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse("http://address:port/directory/testGetAttachment")); 
    downloadID = downloadManager.enqueue(request); 

    downloadReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // TODO Auto-generated method stub 
      Toast.makeText(RESTTestDownloadActivity.this, "ACTION_DOWNLOAD_COMPLETE received.", Toast.LENGTH_LONG); 
      DownloadManager.Query query = new DownloadManager.Query(); 
      query.setFilterById(downloadID); 
      Cursor cursor = downloadManager.query(query); 
      if(cursor.moveToFirst()){ 
       System.out.println("Download matches."); 
       int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS); 
       int status = cursor.getInt(columnIndex); 
       int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON); 
       int reason = cursor.getInt(columnReason); 

       if(status!=DownloadManager.STATUS_SUCCESSFUL){ 
        System.out.println("Download != STATUS_SUCCESSFUL."); 
        AlertDialogBuilder.setTitle("Error") 
         .setMessage(reason) 
         .setPositiveButton("OK", null) 
         .show(); 
       } else { 
        System.out.println("Download = STATUS_SUCCESSFUL."); 
        Toast.makeText(RESTTestDownloadActivity.this, "Download successful.", Toast.LENGTH_LONG).show(); 
        Uri dlUri = Uri.parse(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))); 
        System.out.println("Download-URI: " + dlUri.toString()); 
        unregisterReceiver(downloadReceiver); 
        downloadReceiver = null; 
        // This is working perfectly fine 
        startActivity(new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS)); 
        // But this is crashing 
//     Intent i = new Intent(Intent.ACTION_VIEW, dlUri); 
//     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
//     startActivity(i); 
       } 
       downloadManager.remove(downloadID); 
       downloadReceiver = null; 
      } 
     } 
    }; 
    registerReceiver(downloadReceiver, downloadFilter); 

} 

@Override 
public void onPause(){ 
    super.onPause(); 
    if(downloadReceiver!=null){ 
     System.out.println("Unregistering downloadReceiver..."); 
     unregisterReceiver(downloadReceiver); 
    } 
} 
@Override 
public void onResume(){ 
    super.onResume(); 
    if(downloadReceiver!=null){ 
     System.out.println("Registering downloadReceiver..."); 
     registerReceiver(downloadReceiver, downloadFilter); 
    } 
} 

は、私はすでに hereを述べたようにFLAG_ACTIVITY_NEW_TASKを追加しようとしました。

8月5日13:04:35.437:INFO /のSystem.out(2449):* .RESTTestDownloadActivity.onResume()

08-05 13

LogCatは、以下の出力を行います。 04:35.446:INFO /をSystem.out(2449):登録downloadReceiver ...

08-05 13:04:35.846:INFO/ActivityManager(77):*表示.RESTTestDownloadActivity:+ 561ms

08 -05 13:04:36.046:INFO/DownloadManager(274):Initi 04:40.956:ダウンロード24

08から05 13の要求をating DEBUG/dalvikvm(216):GC_EXPLICITは26Kを解放し、47%フリー3220K/6023K、外部6059K/7285K、68ms

08から05を一時停止13:04:45.855:DEBUG/dalvikvm(157):GC_CONCURRENTは795K、56%無料2872K/6471K、外部2402K/2630K、一時停止10ms + 15ms

08-05 13:04:46.135:INFO/System。 out(2449):ダウンロードしてください。

08-05 13:04:46.135:INFO/System.out(2449):ダウンロード= STATUS_SUCCESSFUL。

08-05 13:04:46.155:INFO /をSystem.out(2449):ダウンロード-URI:内容://ダウンロード/ my_downloads/24

08-05 13:04:46.165:INFO/ActivityManager(77):開始:Intent {act = android.intent.action.VIEW dat = content://ダウンロード/ my_downloads/24 flg = 0x10000000} from pid 2449

08-05 13:04:46.175:DEBUG/AndroidRuntime(2449):04:46.185:VM

08から05 13のシャットダウンWARN/dalvikvm(2449)は:1 =スレッドID:スレッドが捕捉されない例外(グループ= 0x40015560)

で終了します

8月5日13:04:46.195:ERROR/AndroidRuntime(2449):致命的な例外:メイン

8月5日13:04:46.195:ERROR/AndroidRuntime(2449):java.lang.RuntimeException:エラーが受信* [email protected]

08-05 13:04:46.195:ERROR/AndroidRuntime(2449):at androidで、Intent {act = android.intent.action.DOWNLOAD_COMPLETE pkg = *(追加)}をブロードキャストします。 app.LoadedApk $ ReceiverDispatcher $ Args.run(LoadedApk.java:722)

08-05 13:04:46.195:ERROR/AndroidRuntime(2449):android.os.Handler.handleCallback(Handler。ジャワ:587)

8月5日13:04:46.195:ERROR/AndroidRuntime(2449):android.os.Handler.dispatchMessage(Handler.java:92)で

8月5日午後01時04分: 46.195:ERROR/AndroidRuntime(2449):android.os.Looper.loop(Looper.java:123)

08-05 13:04:46.195:ERROR/AndroidRuntime(2449):android.app.ActivityThread .main(ActivityThread.java:3683)

8月5日13:04:46.195:ERROR/AndroidRuntime(2449):java.lang.reflect.Method.invokeNativeで(ネイティブメソッド)

08-05 13:04:46.195:ERROR/AndroidRuntime(2449):java.lang.reflect.Method.invoke(Method.java:507)

08-05 13:04:46.195:エラー/ AndroidRuntime(2449):04:46.195:ERROR/AndroidRuntime(2449):com.androidでcom.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)

08-05 13時.internal.os.ZygoteInit.main(ZygoteInit.java:597)

8月5日13:04:46.195:ERROR/AndroidRuntime(2449):dalvik.system.NativeStart.mainで(ネイティブメソッド)

08-05 13:04:46.195:ERROR/AndroidRunt ime(2449):原因:android.content.ActivityNotFoundException:インテントを処理するアクティビティが見つかりませんでした。{act = android.intent.action.VIEW dat = content:// downloads/my_downloads/24 flg = 0x10000000}

08 -05 13:04:46.195:ERROR/AndroidRuntime(2449):android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1409)

08-05 13:04:46.195:ERROR/AndroidRuntime(2449): android.app.Instrumentation.execStartActivity(Instrumentation.java:1379)

08-05 13:04:46.195:ERROR/AndroidRuntime(2449):android.app.Activity.startActivityForResult(Activity.java:2827)

8月5日13:04:46.195:ERROR/AndroidRuntime(2449):04:46.195:ERROR/AndroidRuntime(android.app.Activity.startActivity(Activity.java:2933)

8月5日13時2449):***でRESTTestDownloadActivity $ 1.onReceive(RESTTestDownloadActivity.java:75)

08-05 13:04:46.195:ERROR/AndroidRuntime(2449):android.app.LoadedApk $ ReceiverDispatcher $ Argsのでは。実行(LoadedApk.java:709)

08-05 13:04:46.195:ERROR/AndroidRuntime(2449):... 9もっと

08-05 13:04:46.216は:/ ActivityManager(WARN 77):力仕上げ活性* .RESTTestDownloadActivity

8月5日13:04:46.739:(77)/ ActivityManagerに警告:HistoryRecord {408abbf0 * .RESTTestDownloadActivity}

の活動休止タイムアウト任意のアイデア理由のみIntent.ACTION_VIEWクラッシュしますか? ありがとうございます!

答えて

3
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=content://downloads/my_downloads/24 flg=0x10000000 } 

を使用しなければならないことです。

0

あなたがIntent.ACTION_VIEWの代わりにDownloadManager.ACTION_VIEW_DOWNLOADSインテントを使用していて、Intent.ACTION_VIEWのためにあなたのビューリクエストを処理できる他のアプリがあります。あなたがダウンロードしているアイテムは、どのアクティビティでも開くことができません。

あなたはアイテムを開くことができるあなた自身のアクティビティを作成するか、アイテムを開くことができる外部APKをインストールする必要があります。

ので、最良の選択は、あなたがAndroidがあなたのために適切なアクティビティを見つけるために、あなたのIntentにMIMEタイプを追加してくださいDownloadManager.ACTION_VIEW_DOWNLOADS

+0

申し訳ありませんが、私はあなたに何を言っているのか分かりません。 Intent DownloadManager.ACTION_VIEW_DOWNLOADSを使用すると、ダウンロードセクションが開き、手動でファイルを開くことができます。これは**ファイルタイプのハンドラが**あることを意味します。 Intent Intent.ACTION_VIEWの使用:一致するファイルタイプハンドラ(実際に存在する)でファイルを自動的に開く必要があります。しかし、それはクラッシュします。 – Mike

1

SDカードにファイルを保存してから、ACTION_VIEWでインテントを実行してみてください。これを行うには、Uri.fromFile(file_object_pointing_to_your_file)メソッドを使用してインテントデータを設定する必要があります。 (この場合、Uri.parse()メソッドがクラッシュします)

0

私は同様のものを持っていますandroid.content.ActivityNotFoundExceptionです。私にとって、最初に "コンテンツ" URIを "ファイル" URIに変換するのに役立ちました:

Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))); 
if ("content".equals(uri.getScheme())) { 
    Cursor cursor = getContentResolver().query(uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null); 
    cursor.moveToFirst(); 
    final String filePath = cursor.getString(0); 
    cursor.close(); 
    uri = Uri.fromFile(new File(filePath)); 
} 
if ("file".equals(uri.getScheme()) { 
    Intent installIntent = new Intent(Intent.ACTION_VIEW); 
    installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Required if launching outside of an activity 
    installIntent.setDataAndType(uri, downloadManager.getMimeTypeForDownloadedFile(downloadId)); 
    startActivity(installIntent); 
} 
関連する問題