Nenhuma atividade encontrada para manipular o Intent: android.intent.action.VIEW


97

Este é o meu código para reproduzir o arquivo 3gp de áudio gravado

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

Mas ao executá-lo em meu dispositivo HTC (Android 2.2 Froyo), mostra uma exceção:

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)

No tablet Galaxy está funcionando bem. Como posso resolver esse problema?


1
É porque seu arquivo é .3gp e você está dizendo ao sistema para reproduzir dados que são mp3?
Blundell

@Blundell eu tentei com 3gp bt ainda a exceção é lançada
jennifer

Respostas:


154

Os endereços de URL devem ser precedidos por http: //

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

lança uma ActivityNotFoundException. Se você acrescentar "http: //", o problema foi resolvido.

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

Pode não ajudar o OP, mas acabei aqui procurando a mesma exceção e talvez ajude outras pessoas.


8
Excelente! O esquema é uma obrigação. file://estava faltando no meu caso até que mudei Uri.parse()para Uri.fromFile().
Stan,

@Stan, obrigado pela solução
Serg Burlaka

Eu estava tendo um problema quando o url foi codificado, então observe que você pode precisar fazerUri.parse(Uri.decode(encodedString))
hmac

40

Se você também está recebendo este erro ao tentar abrir uma página da web a partir de seu aplicativo Android, é porque seu url se parece com este:

www.google.com

ao invés de: https://www.google.com ouhttp://www.google.com

adicione este código à sua atividade / fragmento:

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

apenas passe seu url para openWebPage(). Se já estiver prefixado com https://ou http://então você está pronto para prosseguir, caso contrário, a instrução if trata disso para você


34

Esta é a maneira certa de fazer isso.

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

você precisa importar import android.webkit.MimeTypeMap;


este é o caminho mais longo para fazer isso: d
umerk44

1
Encapsular essa quantidade de código em um bloco try com exceção geral geralmente não é uma boa ideia. O comportamento aqui é totalmente indefinido - você pode dizer quais entradas imprimirão uma mensagem de relance? Que exceções surgirão e por quê? Este é um sinal de código que não foi testado completamente.
jbass de

19

Para mim, ao tentar abrir um link:

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

Eu tenho o mesmo erro android.content.ActivityNotFoundException: No Activity found to handle Intent

O problema era porque eu não tinha nenhum aplicativo que pudesse abrir URLs (ou seja, navegadores) instalado no meu telefone. Então, depois de instalar um navegador, o problema foi resolvido.

* Lição: verifique se há pelo menos um aplicativo que lida com o intent que você está chamando *


6
Então, como podemos lidar com essa situação?
Nikhil

sem um dispositivo de teste personalizado com uma ROM personalizada, você terá uma atividade na Internet. Isso não parece certo.
StarWind0

Estou tendo o mesmo problema sendo relatado por um cliente. Portanto, parece que existem alguns dispositivos nos quais não há um navegador de Internet padrão instalado. Como resolver isso?
Abhijit

Identificou o erro e forneceu uma informação / caixa de diálogo / brinde de que eles não têm um navegador funcionando?
erluxman

1
Veja uma solução stackoverflow.com/questions/22479211/… . Nesse caso, você saberá se um dispositivo contém um navegador padrão (ou um aplicativo que processa um link direto).
CoolMind

17

A resposta de Maragues me fez verificar a saída do logcat. Parece que o caminho que você passa para Uri precisa ser prefixado com
file:/

Uma vez que é um caminho local para o seu armazenamento.

Você também pode querer olhar para o próprio caminho.

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

O ponto de montagem parece aparecer duas vezes no caminho completo.


esta parece ser a resposta certa, mas a pergunta é antiga e o OP foi visto pela última vez há quase 2 meses
Maragues

Isso é o que eu fiz. Infelizmente, só li essa resposta depois de encontrar as soluções :)
Janis Peisenieks

10

Se você não passar o URL correto da web e não tiver um navegador, ActivityNotFoundException ocorre, portanto, verifique esses requisitos ou trate a exceção explicitamente. Isso pode resolver seu problema.

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


3

Eu tive o mesmo problema, então estava olhando para a intenção que está registrada no LogCat. Ao visualizar o vídeo da Galeria, ele chamou a mesma intenção Intent.View, mas definiu o Tipo como "audio / *", o que corrigiu meu problema e não requer a importação de MimeTypeMap. Exemplo:

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

1
Também funciona para vídeos ao usar intent.setDataAndType (data, "video / *") ;
Nestor

3

Se essa exceção tivesse mudado para

"audio / *"

Mas obrigado a @Stan, tornei a solução muito simples, mas útil:

Uri.fromFile(File(content)) em vez de Uri.parse(path)

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

Espero que ajude alguém a resolver o problema.


3

Se você tiver esses erros no seu logcat, use esses códigos para me ajudar

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

Além disso

   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

Primeiro tente este código dentro de AndroidManifest

  <application>

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

Se este código funcionar, tudo bem. Mas senão. Tente este código de qual classe você deseja passar os dados ou uri.

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

Espero que isso resolva seu problema. Obrigado


1

Tenho duas ideias:

Primeiro: se você quiser reproduzir um arquivo 3gp, você deve usar os tipos MIME "audio / 3gpp" ou "audio / mpeg"

E segundo: você pode tentar usar o método setData(data)para intentsem nenhum tipo MIME.

Espero que isto ajude.


ainda a exceção 05-04 17: 30: 30.022: WARN / System.err (4937): android.content.ActivityNotFoundException: Nenhuma atividade encontrada para lidar com o Intent {act = android.intent.action.VIEW dat = / mnt / sdcard / audio-android.3gp} está sendo exibido
jennifer

O Android é compatível com o seu arquivo 3gp? developer.android.com/guide/apethoscope/media-formats.html
Pasha

1

Essa exceção pode surgir quando você manipula Deep linkingou URL para um navegador, se não houver um padrão instalado. No caso de links diretos, pode não haver nenhum aplicativo instalado que possa processar um link no formatomyapp://mylink .

Você pode usar a solução tangerina para API de até 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()
    }
}

Para API> = 30, consulte intent.resolveActivity retorna nulo na API 30 .


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.