• 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
  • 相关阅读:
    HTTP协议详解(转)
    Linux shell 提取文件名和目录名的一些方法(转)
    快速建立ssh互信(转)
    Python 连接mysql
    pt-online-schema-change原理解析(转)
    python基础学习笔记3
    python基础学习笔记2
    DNS服务器原理
    代理服务器(Proxy)原理
    Ext.MessageBox消息框
  • 原文地址:https://www.cnblogs.com/Cjch/p/3104561.html
Copyright © 2020-2023  润新知