Android中可能导致ActivityNotFoundException的一些问题总结

ActivityNotFoundException是Android常见的一个异常,它通常发生在程序无法找到对应的Activity时。由于Android环境较为多样化,实在是需要全方位考虑。

1、最常见的会发生在AndroidManifest.xml文件没有配置需要的Activity路径所导致的,不赘述。

2、第一种情况较为常见,也容易排查。但是近期应用后台异常依然常常报ActivityNotFoundException,因此又调研了一番。跟Intent相关。我们都知道在Android程序中可以使用Intent方便的启动另一个Activity,而Android的SDK中也预置了一些系统级的Activity,常见的有发送短信、发送邮件、拨打电话、打开网页等。但是正如文章开头所说的Android手机种类繁多,在加载可定制的Rom,导致一些机型上面就是没有这些功能,因此如果不把这点考虑进去的话那么,那是必然要报异常的了。真是令人着急!!!下面是一些基本的调用方法,可以放心方便的在程序中使用了:)

    public static void startDialer(Context context, String phoneNumber) {
        try {
            Intent dial = new Intent();
            dial.setAction(Intent.ACTION_DIAL);
            dial.setData(Uri.parse("tel:" + phoneNumber));
            context.startActivity(dial);
        } catch (ActivityNotFoundException ex) {
            Log.e(TAG, "Error starting phone dialer intent.", ex);
            Toast.makeText(context, "Sorry, we couldn't find any app to place a phone call!",
                    Toast.LENGTH_SHORT).show();
        }
    }

    public static void startSmsIntent(Context context, String phoneNumber) {
        try {
            Uri uri = Uri.parse("sms:" + phoneNumber);
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            intent.putExtra("address", phoneNumber);
            intent.setType("vnd.android-dir/mms-sms");
            context.startActivity(intent);
        } catch (ActivityNotFoundException ex) {
            Log.e(TAG, "Error starting sms intent.", ex);
            Toast.makeText(context, "Sorry, we couldn't find any app to send an SMS!",
                    Toast.LENGTH_SHORT).show();
        }
    }

    public static void startEmailIntent(Context context, String emailAddress) {
        try {
            Intent intent = new Intent(android.content.Intent.ACTION_SEND);
            intent.setType("plain/text");
            intent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {
                emailAddress
            });
            context.startActivity(intent);
        } catch (ActivityNotFoundException ex) {
            Log.e(TAG, "Error starting email intent.", ex);
            Toast.makeText(context, "Sorry, we couldn't find any app for sending emails!",
                    Toast.LENGTH_SHORT).show();
        }
    }

    public static void startWebIntent(Context context, String url) {
        try {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            context.startActivity(intent);
        } catch (ActivityNotFoundException ex) {
            Log.e(TAG, "Error starting url intent.", ex);
            Toast.makeText(context, "Sorry, we couldn't find any app for viewing this url!",
                    Toast.LENGTH_SHORT).show();
        }
    }

附加一些Android基本的Intent

1.从google搜索内容 
Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_WEB_SEARCH); 
intent.putExtra(SearchManager.QUERY,"searchString") 
startActivity(intent); 

2.浏览网页 
Uri uri = Uri.parse("http://www.google.com"); 
Intent it   = new Intent(Intent.ACTION_VIEW,uri); 
startActivity(it); 

3.显示地图 
Uri uri = Uri.parse("geo:38.899533,-77.036476"); 
Intent it = new Intent(Intent.Action_VIEW,uri); 
startActivity(it); 

4.路径规划 
Uri uri = Uri.parse("http://maps.google.com/maps?f=dsaddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); 
Intent it = new Intent(Intent.ACTION_VIEW,URI); 
startActivity(it); 

5.拨打电话 
Uri uri = Uri.parse("tel:xxxxxx"); 
Intent it = new Intent(Intent.ACTION_DIAL, uri);   
startActivity(it); 

6.调用发短信的程序 
Intent it = new Intent(Intent.ACTION_VIEW);   
it.putExtra("sms_body", "The SMS text");   
it.setType("vnd.android-dir/mms-sms");   
startActivity(it); 

7.发送短信 
Uri uri = Uri.parse("smsto:0800000123");   
Intent it = new Intent(Intent.ACTION_SENDTO, uri);   
it.putExtra("sms_body", "The SMS text");   
startActivity(it); 
String body="this is sms demo"; 
Intent mmsintent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("smsto", number, null)); 
mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); 
mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true); 
mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, true); 
startActivity(mmsintent); 

8.发送彩信 
Uri uri = Uri.parse("content://media/external/images/media/23");   
Intent it = new Intent(Intent.ACTION_SEND);   
it.putExtra("sms_body", "some text");   
it.putExtra(Intent.EXTRA_STREAM, uri);   
it.setType("image/png");   
startActivity(it); 
StringBuilder sb = new StringBuilder(); 
sb.append("file://"); 
sb.append(fd.getAbsoluteFile()); 
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mmsto", number, null)); 
// Below extra datas are all optional. 
intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_SUBJECT, subject); 
intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); 
intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI, sb.toString()); 
intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, composeMode); 
intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, exitOnSent); 
startActivity(intent); 

9.发送Email 
Uri uri = Uri.parse("mailto:xxx@abc.com"); 
Intent it = new Intent(Intent.ACTION_SENDTO, uri); 
startActivity(it); 
Intent it = new Intent(Intent.ACTION_SEND);   
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");   
it.putExtra(Intent.EXTRA_TEXT, "The email body text");   
it.setType("text/plain");   
startActivity(Intent.createChooser(it, "Choose Email Client")); 
Intent it=new Intent(Intent.ACTION_SEND);     
String[] tos={"me@abc.com"};     
String[] ccs={"you@abc.com"};     
it.putExtra(Intent.EXTRA_EMAIL, tos);     
it.putExtra(Intent.EXTRA_CC, ccs);     
it.putExtra(Intent.EXTRA_TEXT, "The email body text");     
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");     
it.setType("message/rfc822");     
startActivity(Intent.createChooser(it, "Choose Email Client"));   

Intent it = new Intent(Intent.ACTION_SEND);   
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");   
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");   
sendIntent.setType("audio/mp3");   
startActivity(Intent.createChooser(it, "Choose Email Client")); 

10.播放多媒体   
Intent it = new Intent(Intent.ACTION_VIEW); 
Uri uri = Uri.parse("file:///sdcard/song.mp3"); 
it.setDataAndType(uri, "audio/mp3"); 
startActivity(it); 
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");   
Intent it = new Intent(Intent.ACTION_VIEW, uri);   
startActivity(it); 

11.uninstall apk 
Uri uri = Uri.fromParts("package", strPackageName, null);   
Intent it = new Intent(Intent.ACTION_DELETE, uri);   
startActivity(it); 

12.install apk 
Uri installUri = Uri.fromParts("package", "xxx", null); 
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); 

13. 打开照相机 
<1>Intent i = new Intent(Intent.ACTION_CAMERA_BUTTON, null); 
          this.sendBroadcast(i); 
    <2>long dateTaken = System.currentTimeMillis(); 
         String name = createName(dateTaken) + ".jpg"; 
         fileName = folder + name; 
         ContentValues values = new ContentValues(); 
         values.put(Images.Media.TITLE, fileName); 
         values.put("_data", fileName); 
         values.put(Images.Media.PICASA_ID, fileName); 
         values.put(Images.Media.DISPLAY_NAME, fileName); 
         values.put(Images.Media.DESCRIPTION, fileName); 
         values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, fileName); 
         Uri photoUri = getContentResolver().insert( 
                   MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
           
         Intent inttPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
         inttPhoto.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); 
         startActivityForResult(inttPhoto, 10); 

14.从gallery选取图片 
   Intent i = new Intent(); 
         i.setType("image/*"); 
         i.setAction(Intent.ACTION_GET_CONTENT); 
         startActivityForResult(i, 11); 

15. 打开录音机 
Intent mi = new Intent(Media.RECORD_SOUND_ACTION); 
         startActivity(mi); 

16.显示应用详细列表      
Uri uri = Uri.parse("market://details?id=app_id");        
Intent it = new Intent(Intent.ACTION_VIEW, uri);        
startActivity(it);        
//where app_id is the application ID, find the ID         
//by clicking on your application on Market home         
//page, and notice the ID from the address bar     

刚才找app id未果,结果发现用package name也可以 
Uri uri = Uri.parse("market://details?id=<packagename>"); 
这个简单多了 

17寻找应用      
Uri uri = Uri.parse("market://search?q=pname:pkg_name");        
Intent it = new Intent(Intent.ACTION_VIEW, uri);        
startActivity(it); 
//where pkg_name is the full package path for an application      

18打开联系人列表 
         <1>           
          Intent i = new Intent(); 
          i.setAction(Intent.ACTION_GET_CONTENT); 
          i.setType("vnd.android.cursor.item/phone"); 
          startActivityForResult(i, REQUEST_TEXT); 

         <2> 
         Uri uri = Uri.parse("content://contacts/people"); 
         Intent it = new Intent(Intent.ACTION_PICK, uri); 
         startActivityForResult(it, REQUEST_TEXT); 

19 打开另一程序 
Intent i = new Intent(); 
         ComponentName cn = new ComponentName("com.yellowbook.android2", 
                   "com.yellowbook.android2.AndroidSearch"); 
         i.setComponent(cn); 
         i.setAction("android.intent.action.MAIN"); 
         startActivityForResult(i, RESULT_OK);
View Code

 

posted on 2013-05-28 20:59  Jessie~Alexandery  阅读(3112)  评论(0编辑  收藏  举报

导航