Сбой активности Android при попытке запустить Intent.ACTION_VIEW из BroadcastReceiver - PullRequest
2 голосов
/ 05 августа 2011

Моя деятельность должна загрузить файл и затем открыть его, отправив Intent.ACTION_VIEW. Сама загрузка работает нормально, я могу получить к ней доступ в разделе «Загрузки». Если я использую намерение DownloadManager.ACTION_VIEW_DOWNLOADS вместо Intent.ACTION_VIEW, оно также работает нормально.

Но при использовании 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);
    }
}

Как видите, я уже пытался добавить FLAG_ACTIVITY_NEW_TASK, как указано здесь . * * 1010

LogCat выводит следующее:

08-05 13: 04: 35.437: INFO / System.out (2449): * .RESTTestDownloadActivity.onResume ()

08-05 13: 04: 35.446: INFO / System.out (2449): регистрация загрузочного приемника ...

08-05 13: 04: 35.846: INFO / ActivityManager (77): отображается * .RESTTestDownloadActivity: + 561 мс

08-05 13: 04: 36.046: INFO / DownloadManager (274): инициирование запроса на скачивание 24

08-05 13: 04: 40.956: DEBUG / dalvikvm (216): GC_EXPLICIT освобожден 26K, 47% свободен 3220K / 6023K, внешний 6059K / 7285K, приостановлен 68 мс

08-05 13: 04: 45.855: DEBUG / dalvikvm (157): GC_CONCURRENT освобожден 795K, 56% свободен 2872K / 6471K, внешний 2402K / 2630K, приостановлен на 10 мс + 15 мс

08-05 13: 04: 46.135: INFO / System.out (2449): загрузить gefunden.

08-05 13: 04: 46.135: INFO / System.out (2449): Загрузить = STATUS_SUCCESSFUL.

08-05 13: 04: 46.155: INFO / System.out (2449): URI загрузки: content: // downloads / my_downloads / 24

08-05 13: 04: 46.165: INFO / ActivityManager (77): Запуск: Intent {act = android.intent.action.VIEW dat = content: // downloads / my_downloads / 24 flg = 0x10000000} из pid 2449

08-05 13: 04: 46.175: DEBUG / AndroidRuntime (2449): выключение виртуальной машины

08-05 13: 04: 46.185: WARN / dalvikvm (2449): threadid = 1: поток завершается с исключением из необработанного состояния (группа = 0x40015560)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: main

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): java.lang.RuntimeException: Ошибка при приеме трансляции Intent {act = android.intent.action.DOWNLOAD_COMPLETE pkg = * (имеет дополнительные элементы)} в *. RESTTestDownloadActivity $ 1 @ 405376e8

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): at android.app.LoadedApk $ ReceiverDispatcher $ Args.run (LoadedApk.java:722)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): на android.os.Handler.handleCallback (Handler.java:587)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): на android.os.Handler.dispatchMessage (Handler.java:92)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): на android.os.Looper.loop (Looper.java:123)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): на android.app.ActivityThread.main (ActivityThread.java:3683)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): на java.lang.reflect.Method.invokeNative (собственный метод)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): в java.lang.reflect.Method.invoke (Method.java:507)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:839)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): в dalvik.system.NativeStart.main (собственный метод)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): вызвано: android.content.ActivityNotFoundException: не найдено действие для обработки Intent {act = android.intent.action.VIEW dat = content: // downloads / my_downloads / 24 flg = 0x10000000}

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): в android.app.Instrumentation.checkStartActivityResult (Instrumentation.java:1409)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): на android.app.Instrumentation.execStartActivity (Instrumentation.java:1379)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): в android.app.Activity.startActivityForResult (Activity.java:2827)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): в android.app.Activity.startActivity (Activity.java:2933)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): в ***. RESTTestDownloadActivity $ 1.onReceive (RESTTestDownloadActivity.java:75)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): at android.app.LoadedApk $ ReceiverDispatcher $ Args.run (LoadedApk.java:709)

08-05 13: 04: 46.195: ОШИБКА / AndroidRuntime (2449): ... еще 9

08-05 13: 04: 46.216: WARN / ActivityManager (77): Принудительное завершение операции * .RESTTestDownloadActivity

08-05 13: 04: 46.739: WARN / ActivityManager (77): Тайм-аут паузы активности для HistoryRecord {408abbf0 * .RESTTestDownloadActivity}

Есть идеи, почему только Intent.ACTION_VIEW приводит к сбою? Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 05 августа 2011
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=content://downloads/my_downloads/24 flg=0x10000000 }

Пожалуйста, добавьте тип MIME к вашему Intent, чтобы помочь Android найти подходящее занятие для вас.

1 голос
/ 16 августа 2012

Попробуйте сохранить файл на SD-карте, а затем запустить ACTION_VIEW. Чтобы это работало, вам нужно установить данные о намерениях с помощью метода Uri.fromFile (file_object_pointing_to_your_file). (В этом случае метод Uri.parse () вызовет сбой)

0 голосов
/ 04 января 2013

У меня был похожий 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);
}
0 голосов
/ 05 августа 2011

Вы получаете эту ошибку, потому что вы используете DownloadManager.ACTION_VIEW_DOWNLOADS Intent вместо Intent.ACTION_VIEW, а для Intent.ACTION_VIEW есть активность в вашем приложении или любом другом приложении, которое может обработать ваш запрос на просмотр. Я имею в виду элемент, который вызагрузка не может быть открыта никаким действием.

Так что вы либо создаете свое собственное действие, которое может открыть ваш элемент, либо вам нужно установить внешний apk, который может открыть ваш элемент.

Так что лучше всеговыбор в том, что вы должны использовать DownloadManager.ACTION_VIEW_DOWNLOADS

...