139

This is my code to play the recorded audio 3gp file

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

But while running it in my HTC device (Android 2.2 Froyo) shows an exception:

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)

In Galaxy tablet it's working fine. How can I resolve this issue?

halfer
  • 19,824
  • 17
  • 99
  • 186
jennifer
  • 8,133
  • 22
  • 69
  • 96

17 Answers17

201

Url addresses must be preceded by http://

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

throws an ActivityNotFoundException. If you prepend "http://", problem solved.

Uri uri = Uri.parse("http://www.google.com");
Dharman
  • 30,962
  • 25
  • 85
  • 135
Maragues
  • 37,861
  • 14
  • 95
  • 96
62

If you are also getting this error when trying to open a web page from your android app it is because your url looks like this:

www.google.com

instead of: https://www.google.com or http://www.google.com

add this code to your Activity/Fragment:

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

just pass your url to openWebPage(). If it is already prefixed with https:// or http:// then you are good to go, else the if statement handles that for you

Ojonugwa Jude Ochalifu
  • 26,627
  • 26
  • 120
  • 132
33

This is the right way to do it.

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

you need to import import android.webkit.MimeTypeMap;

Nitan Sehgal
  • 339
  • 2
  • 2
  • this is the long way to do it :d – umerk44 Feb 26 '14 at 11:00
  • 1
    Wrapping that much code in a try block with general exception is usually not a good idea. The behavior here is totally undefined - can you tell which inputs will print a message at a glance? What exceptions will arise, and why? This is a sign of code that has not been tested thoroughly. – jbass Feb 08 '17 at 22:58
  • 1
    @jbass If you really expect some specific error to happen more or less regularly it is no exception and should be prevented before. The general exeption is a very good idea to catch them all if you don't really care about the reason and just don't want your app to crash. What exactly is undefined here? The last command in the try block starts the activity. Everything before doesn't matter and will be garbage collected. 6 lines in this try block should be a lot? Really? Don't think so. – The incredible Jan Sep 07 '21 at 09:33
  • @TheincredibleJan As a thought experiment, why not wrap 100% of everything we write in a try block, and why isn't it already done for us by default? Exceptions are more or less designed to crash the program to make bugs more visible, unless they are explicitly caught. – jbass Feb 17 '23 at 17:49
  • Ensure that there are no spaces in the URL, as this issue can also occur when there are spaces present in the URL. – Muhammad Afzal Apr 10 '23 at 07:59
28

For me when trying to open a link :

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

I got the same error android.content.ActivityNotFoundException: No Activity found to handle Intent

The problem was because i didnt have any app that can open URLs (i.e. browsers) installed in my phone. So after Installing a browser the problem was solved.

*Lesson : Make sure there is at least one app which handles the intent you are calling *

erluxman
  • 18,155
  • 20
  • 92
  • 126
  • 7
    So how can we handle this situation? – Nikhil Oct 05 '16 at 13:40
  • without a custom test device with a custom ROM, you will have an internet activity. This doesn't sound right at all. – StarWind0 Jan 02 '20 at 16:55
  • I am having the same issue being reported by a customer. So it seems that there are some devices on which there is no default internet browser installed. How to solve this? – Abhijit Mar 29 '20 at 05:23
  • 2
    Catch the error and give an info/dialog/toast that they do not have a working browser? – erluxman Mar 29 '20 at 06:14
  • 1
    See a solution https://stackoverflow.com/questions/22479211/intent-resolveactivity-null-but-launching-the-intent-throws-an-activitynotfou. In this case you will know, whether a device contains a default browser (or an application that processes a Deep link). – CoolMind Jun 23 '20 at 09:29
  • It solved my case, where I was trying to open a `.csv` file. There was no app installed to handle `.csv` files, thus the error. To figure it out, I had to temporary change the file extension to something I was sure I had an app to open, `.txt`, and it worked. So I installed an app which could handle spreadsheets. – iloo Apr 23 '21 at 06:15
  • Ensure that there are no spaces in the URL, as this issue can also occur when there are spaces present in the URL. – Muhammad Afzal Apr 10 '23 at 08:00
18

Answer by Maragues made me check out logcat output. Appears that the path you pass to Uri needs to be prefixed with
file:/

Since it is a local path to your storage.

You may want too look at the path itself too.

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

Mount point seems to appear twice in the full path.

Joel Bodega
  • 644
  • 5
  • 8
14

If you don't pass the correct web URL and don't have a browser, ActivityNotFoundException occurs, so check those requirements or handle the exception explicitly. That can resolve your problem.

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();
    }
}
Pang
  • 9,564
  • 146
  • 81
  • 122
10

Check this useful method:

URLUtil.guessUrl(urlString)

It makes google.com -> http://google.com

niko1312
  • 211
  • 3
  • 4
7

This exception can raise when you handle Deep linking or URL for a browser, if there is no default installed. In case of Deep linking there may be no application installed that can process a link in format myapp://mylink.

You can use the tangerine solution for API up to 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()
    }
}

For API >= 30 see intent.resolveActivity returns null in API 30.

CoolMind
  • 26,736
  • 15
  • 188
  • 224
5

To avoid crash below 2 things need to be checked

  1. Check if url starts with http or https
  2. Check if device has any app that can handle url

Kotlin

if (url.startsWith("http") || url.startsWith("https")) {
    Intent(Intent.ACTION_VIEW,Uri.parse(url)).apply{
    // Below condition checks if any app is available to handle intent
    if (resolveActivity(packageManager) != null) {
           startActivity(this)
       }
    }
}
Tarun Anchala
  • 2,232
  • 16
  • 15
4

If you have these error in your logcat then use these code it help me

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

also

   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());
            }
Mujahid Khan
  • 1,712
  • 1
  • 18
  • 24
4

I had this same issue, so I was looking at the intent which is logged in LogCat. When viewing the video from the Gallery, it called the same Intent.View intent, but set the Type to "audio/*", which fixed my issue, and doesn't require importing MimeTypeMap. Example:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
Uri data = Uri.parse(path);
intent.setDataAndType(data, "audio/*");
startActivity(intent);
Adam
  • 1,076
  • 1
  • 11
  • 24
3

Had this exception even changed to

"audio/*"

But thanx to @Stan i have turned very simple but usefully solution:

Uri.fromFile(File(content)) instead Uri.parse(path)

 val intent =Intent(Intent.ACTION_VIEW)
                    intent.setDataAndType(Uri.fromFile(File(content)),"audio/*")
                    startActivity(intent)
Dharman
  • 30,962
  • 25
  • 85
  • 135
Serg Burlaka
  • 2,351
  • 24
  • 35
2

I have two ideas:

First: if you want to play 3gp file you should use mime types "audio/3gpp" or "audio/mpeg"

And second: you can try use method setData(data) for intent without any mime type.

Dharman
  • 30,962
  • 25
  • 85
  • 135
Pasha
  • 2,407
  • 18
  • 25
  • still the exception 05-04 17:30:30.022: WARN/System.err(4937): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/audio-android.3gp } is showing – jennifer May 04 '11 at 12:01
  • Is android support your 3gp file? http://developer.android.com/guide/appendix/media-formats.html – Pasha May 04 '11 at 12:15
1

First try this code inside AndroidManifest

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

If this code works, so fine. But if not. Try this code from which class you want to pass the data or uri.

Intent window = new Intent(getApplicationContext(), Browser.class);
window.putExtra("LINK", "http://www.yourwebsite.com");
startActivity(window);
Dharman
  • 30,962
  • 25
  • 85
  • 135
Mukta
  • 1,357
  • 1
  • 15
  • 17
1

instead of using Try and catch. You should use this way

val intent = Intent(Intent.ACTION_VIEW)
                    intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
                    intent.setDataAndType(uri, type)    
startActivity(Intent.createChooser(intent, "view action"))
Đốc.tc
  • 530
  • 4
  • 12
0

try checking with any Url like add

https://www.google.com

in path and start activity if its works than you are adding wrong path

0

I had a problem like this case. In my case , it used to happen when I didn't have a browser app in my phone. I installed a browser app and solved my problem. Don't forget to put your code in Try/Catch block.

Javad Shirkhani
  • 343
  • 6
  • 11