Не найдено действий для обработки намерения: android.intent.action.VIEW

98

Это мой код для воспроизведения записанного аудио файла 3gp

 Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
        Uri data = Uri.parse(path);
        intent.setDataAndType(data, "audio/mp3");
        startActivity(intent);

Но при запуске в моем устройстве HTC (Android 2.2 Froyo) выдает исключение:

05-04 16:37:37.597: WARN/System.err(4065): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/mnt/sdcard/audio-android.3gp typ=audio/mp3 }
05-04 16:37:37.597: WARN/System.err(4065):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1567)
05-04 16:37:37.597: INFO/ActivityManager(92): Starting activity: Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/mnt/sdcard/audio-android.3gp typ=audio/mp3 }
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1537)
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.Activity.startActivityForResult(Activity.java:2858)
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.Activity.startActivity(Activity.java:2964)
05-04 16:37:37.607: WARN/System.err(4065):     at com.ey.camera.AudioRecorder.playAudio(AudioRecorder.java:244)
05-04 16:37:37.607: WARN/System.err(4065):     at com.ey.camera.AudioRecorder$4.onClick(AudioRecorder.java:225)
05-04 16:37:37.607: WARN/System.err(4065):     at android.view.View.performClick(View.java:2408)
05-04 16:37:37.607: WARN/System.err(4065):     at android.view.View$PerformClick.run(View.java:8817)
05-04 16:37:37.607: WARN/System.err(4065):     at android.os.Handler.handleCallback(Handler.java:587)
05-04 16:37:37.607: WARN/System.err(4065):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-04 16:37:37.607: WARN/System.err(4065):     at android.os.Looper.loop(Looper.java:144)
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.ActivityThread.main(ActivityThread.java:4937)
05-04 16:37:37.607: WARN/System.err(4065):     at java.lang.reflect.Method.invokeNative(Native Method)
05-04 16:37:37.607: WARN/System.err(4065):     at java.lang.reflect.Method.invoke(Method.java:521)
05-04 16:37:37.607: WARN/System.err(4065):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-04 16:37:37.607: WARN/System.err(4065):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-04 16:37:37.607: WARN/System.err(4065):     at dalvik.system.NativeStart.main(Native Method)

В планшете Galaxy работает нормально. Как я могу решить эту проблему?

Дженнифер
источник
1
Это потому, что ваш файл имеет формат .3gp и вы приказываете системе воспроизводить данные в формате mp3?
Бланделл
@Blundell, я пробовал использовать 3gp bt, но исключение выбрасывается
дженнифер

Ответы:

155

Адресам URL должен предшествовать http: //

Uri uri = Uri.parse("www.google.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);

выбрасывает ActivityNotFoundException. Если вы добавите «http: //», проблема решена.

Uri uri = Uri.parse("http://www.google.com");

Может не помочь OP, но я оказался здесь в поисках того же исключения, и, возможно, это помогает другим.

Maragues
источник
8
Превосходно! Схема обязательна. file://в моем случае отсутствовал, пока я не перешел Uri.parse()на Uri.fromFile().
Стэн
@Stan спасибо за решение
Серг Бурлака
У меня возникла проблема, когда URL-адрес был закодирован, поэтому обратите внимание, что вам может понадобиться сделатьUri.parse(Uri.decode(encodedString))
hmac
40

Если вы также получаете эту ошибку при попытке открыть веб-страницу из вашего приложения для Android, это потому, что ваш URL-адрес выглядит следующим образом:

www.google.com

вместо: https://www.google.comилиhttp://www.google.com

добавьте этот код в свою активность / фрагмент:

 public void openWebPage(String url) {

    Uri webpage = Uri.parse(url);

    if (!url.startsWith("http://") && !url.startsWith("https://")) {
        webpage = Uri.parse("http://" + url);
    }

    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

просто передайте свой URL openWebPage(). Если он уже имеет префикс https://или, http://тогда вам хорошо идти, иначе оператор if сделает это за вас.

Оджонугва Джуд Очалифу
источник
34

Это правильный способ сделать это.

    try
    {
    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);
    File file = new File(aFile.getAbsolutePath()); 
    String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString());
    String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    myIntent.setDataAndType(Uri.fromFile(file),mimetype);
    startActivity(myIntent);
    }
    catch (Exception e) 
    {
        // TODO: handle exception
        String data = e.getMessage();
    }

вам нужно импортировать import android.webkit.MimeTypeMap;

Нитан Сегал
источник
это долгий путь: d
umerk44
1
Оборачивание такого количества кода в блоке try с общим исключением обычно не является хорошей идеей. Поведение здесь полностью не определено - можете ли вы сразу определить, какие входы будут печатать сообщение? Какие исключения возникнут и почему? Это признак того, что код не был тщательно протестирован.
jbass
19

У меня при попытке открыть ссылку:

Uri uri = Uri.parse("https://www.facebook.com/abc/");
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);

У меня такая же ошибка android.content.ActivityNotFoundException: No Activity found to handle Intent

Проблема заключалась в том, что на моем телефоне не было приложения, которое могло бы открывать URL-адреса (например, браузеры). Итак, после установки браузера проблема была решена.

* Урок: убедитесь, что существует хотя бы одно приложение, которое обрабатывает вызываемое вами намерение *

Erluxman
источник
6
Итак, как мы можем справиться с этой ситуацией?
Nikhil
без специального тестового устройства с пользовательским ПЗУ у вас будет активность в Интернете. Это совсем не так.
StarWind0
У меня такая же проблема, о которой сообщает клиент. Похоже, что есть устройства, на которых не установлен интернет-браузер по умолчанию. Как это решить?
Абхиджит
Поймать ошибку и дать информацию / диалог / тост, что у них нет работающего браузера?
erluxman
1
См. Решение stackoverflow.com/questions/22479211/… . В этом случае вы узнаете, содержит ли устройство браузер по умолчанию (или приложение, обрабатывающее глубокую ссылку).
CoolMind
17

Ответ Maragues заставил меня проверить вывод logcat. Похоже, что путь, который вы проходите к Uri, должен иметь префикс
file:/

Поскольку это локальный путь к вашему хранилищу.

Вы также можете посмотреть на сам путь.

`05-04 16:37:37.597: WARN/System.err(4065): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/mnt/sdcard/audio-android.3gp typ=audio/mp3 }`

Точка монтирования появляется дважды на полном пути.

Джоэл Бодега
источник
это кажется правильным ответом, но вопрос старый, и OP в последний раз видели почти 2 месяца назад
Maragues
Вот что я сделал. К сожалению, я прочитал этот ответ только после того, как нашел решения :)
Янис Пейсениекс
10

Если вы не передаете правильный URL-адрес и у вас нет браузера, возникает ActivityNotFoundException, поэтому проверьте эти требования или обработайте исключение явным образом. Это может решить вашу проблему.

public static void openWebPage(Context context, String url) {
    try {
        if (!URLUtil.isValidUrl(url)) {
            Toast.makeText(context, " This is not a valid link", Toast.LENGTH_LONG).show();   
        } else {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(url));
            context.startActivity(intent);
        }
    } catch (ActivityNotFoundException e) {
        Toast.makeText(context, " You don't have any browser to open web page", Toast.LENGTH_LONG).show();
    }
}
Рам нарайан Райгар
источник
7

Проверьте этот полезный метод:

URLUtil.guessUrl(urlString)

Это делает google.com -> http://google.com

niko1312
источник
3

У меня была такая же проблема, поэтому я смотрел на намерение, которое зарегистрировано в LogCat. При просмотре видео из галереи он вызывал то же намерение Intent.View, но для параметра Тип было установлено значение «audio / *», что устранило мою проблему и не требует импорта MimeTypeMap. Пример:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
Uri data = Uri.parse(path);
intent.setDataAndType(data, "audio/*");
startActivity(intent);
Адам
источник
1
Также работает для видео при использовании intent.setDataAndType (data, "video / *") ;
Нестор
3

Если бы это исключение даже изменилось на

"аудио / *"

Но спасибо @Stan, я получил очень простое, но полезное решение:

Uri.fromFile(File(content)) вместо Uri.parse(path)

 val intent =Intent(Intent.ACTION_VIEW)
                    intent.setDataAndType(Uri.fromFile(File(content)),"audio/*")
                    startActivity(intent)

Надеюсь, это поможет кому-нибудь решить его проблему.

Серг Бурлака
источник
3

Если у вас есть эта ошибка в вашем журнале, используйте этот код, он мне поможет

 Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.fromFile(new File(data.getLocation())), "audio/*");
            try {
                context.startActivity(intent);
            } catch (ActivityNotFoundException e) {
                Log.d("error", e.getMessage());
            }

также

   Intent intent = new Intent(MediaStore.INTENT_ACTION_MUSIC_PLAYER);
            intent.setDataAndType(Uri.fromFile(new File(data.getLocation())), "audio/*");
            try {
                context.startActivity(intent);
            } catch (ActivityNotFoundException e) {
                Log.d("error", e.getMessage());
            }
Муджахид Хан
источник
2

Сначала попробуйте этот код внутри AndroidManifest

  <application>

    <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />
 </application>

Если этот код работает, все в порядке. Но если нет. Попробуйте этот код, из какого класса вы хотите передать данные или uri.

Intent window = new Intent(getApplicationContext(), Browser.class);
window.putExtra("LINK", "http://www.yourwebsite.com");
startActivity(window);

Надеюсь, это решит вашу проблему. Спасибо

Мукта
источник
1

У меня две идеи:

Во-первых: если вы хотите воспроизвести файл 3gp, вы должны использовать типы MIME «audio / 3gpp» или «audio / mpeg».

И второе: вы можете попробовать метод использовать setData(data)для intentбез какого - либо типа пантомимы.

Надеюсь это поможет.

Паша
источник
все еще исключение 05-04 17: 30: 30.022: WARN / System.err (4937): android.content.ActivityNotFoundException: не обнаружено действие для обработки намерения {act = android.intent.action.VIEW dat = / mnt / sdcard / audio-android.3gp}
дженнифер
Поддерживает ли Android ваш файл 3gp? developer.android.com/guide/appendix/media-formats.html
Паша
1

Это исключение может возникать при обработке Deep linkingили URL-адресе браузера, если он не установлен по умолчанию. В случае использования прямых ссылок может не быть установлено приложение, которое может обрабатывать ссылку в форматеmyapp://mylink .

Вы можете использовать мандариновый раствор для API до 29:

private fun openUrl(url: String) {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
    val activityInfo = intent.resolveActivityInfo(packageManager, intent.flags)
    if (activityInfo?.exported == true) {
        startActivity(intent)
    } else {
        Toast.makeText(
            this,
            "No application that can handle this link found",
            Toast.LENGTH_SHORT
        ).show()
    }
}

Для API> = 30 см. Intent.resolveActivity возвращает null в API 30 .

CoolMind
источник
0

попробуйте проверить с любым URL-адресом, например добавить

https://www.google.com

в пути и начать действие, если оно работает, чем вы добавляете неправильный путь

Разработчик Ars
источник