【问题标题】:How to detect if device is capable of calling and messaging如何检测设备是否能够呼叫和发送消息
【发布时间】:2011-09-15 11:00:00
【问题描述】:

一些设备,即。 Galaxy Tablet 10.1 只能发短信,不能打电话。其他一些设备,例如 Asus Transformer,甚至没有 SIM 卡。

如何检测设备是否可以拨打电话?以及如何检测设备是否可以发送短信?

【问题讨论】:

    标签: android telephony


    【解决方案1】:

    使用此技术,您也可以测试各种事物,例如指南针,有位置吗

        PackageManager pm = getBaseContext().getPackageManager();
        pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
    

    【讨论】:

    • 对 SMS 没有帮助,是吗?
    • 不幸的是,这会在某些手机设备和模拟器上产生误报。
    • 我知道这个问题已经很老了,但我想澄清一下这段代码,以防将来有人找到这个答案:这段代码显示了设备是否能够使用电话功能,但这并不意味着它现在可以拨打电话或发送短信。例如,如果您在没有 SIM 卡的手机上运行此代码(显然是无法拨打电话或发送短信的设备),尽管没有 SIM 卡,它仍会返回 true
    • 这不适用于某些实际上能够拨打电话的平板电脑。
    【解决方案2】:

    也许您可以query the PackageManager 系统是否包含任何可以响应 ACTION_CALL 和 ACTION_SENDTO 意图的组件?您可能需要在 URI 中添加“tel:”和“smsto:”方案。

    【讨论】:

    • 我在考虑它的时间不超过2天,但我没有时间尝试它,测试它。当然,这是这样做的方法。
    • 平板电脑似乎确实对 ACTION_DIAL 等做出反应。他们会显示一个小对话框,让您可以选择将号码添加到您的联系人中。所以我怀疑这会奏效。
    【解决方案3】:

    应该这样做:

     PackageManager pm = this.getPackageManager();
    
     if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
         System.out.println("horray");
     } else {
         System.out.println("nope");
     }
    

    【讨论】:

    • 对 SMS 没有帮助,是吗?
    • 它实际上应该是因为 SMS 不使用数据连接,而是像电话一样使用 2G
    • 是的,但正如我所说。 Galaxy Tab 10.1 可以发短信,但不能打电话。那么如何才能将这两件事分开呢?
    • 不过,这对检测 SMS 功能有问题。如果设备安装了 Google Voice,即使它没有任何电话功能,它仍然可以发送 SMS。因此,这种方法可能会给您带来误报。除非存在更好的东西,否则在我看来,最好的方法是正常准备 SMS 意图,将其传递给 startActivity(),然后捕获 ActivityNotFoundException。这样,如果它失败了,至少它会优雅地失败,并且您可以显示一条错误消息来说明失败的原因。
    【解决方案4】:

    您可以使用以下方法检查是否支持短信功能:

    private void sendSms(String theNumber, String theMsg) {
            // TODO Auto-generated method stub
            String SENT = "Message Sent";
            String DELIVERED = "Message Delivered";
    
            PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(SENT), 0);
            PendingIntent deliveredPI = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent(DELIVERED), 0);
    
            registerReceiver(new BroadcastReceiver() {
    
                @Override
                public void onReceive(Context context, Intent intent) {
                    // TODO Auto-generated method stub
                    switch(getResultCode()){
                    case Activity.RESULT_OK:   Toast.makeText(getApplicationContext(), "Message Sent", Toast.LENGTH_SHORT).show();
                                                break;
                    case Activity.RESULT_CANCELED: Toast.makeText(getApplicationContext(), "Message Not Sent", Toast.LENGTH_SHORT).show();
                                                    break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:  Toast.makeText(getApplicationContext(), "No Service Available", Toast.LENGTH_SHORT).show();
                                                               break;
                    }
                }
            }, new IntentFilter(SENT));
    
            registerReceiver(new BroadcastReceiver() {
    
                @Override
                public void onReceive(Context context, Intent intent) {
                    // TODO Auto-generated method stub
                    switch(getResultCode()){
                    case Activity.RESULT_OK:   Toast.makeText(getApplicationContext(), "Message Delivered", Toast.LENGTH_SHORT).show();
                                                break;
                    case Activity.RESULT_CANCELED: Toast.makeText(getApplicationContext(), "Message Not Delivered", Toast.LENGTH_SHORT).show();
                                                    break;
    
                    }
                }
            }, new IntentFilter(DELIVERED));
    
    
            SmsManager sms = SmsManager.getDefault();
            sms.sendTextMessage(theNumber, null, theMsg, sentPI, deliveredPI);
        }
    

    【讨论】:

      【解决方案5】:

      您可以将代码包装在 try/catch 中。它适用于所有情况,即使是关于短信发送的最后一个 API 更改。

      try{
          // code that use telephony features
      }
      catch(Exception e){
          // code that doesn't use telephony features
      }
      

      【讨论】:

        【解决方案6】:

        这是我检查是否可以使用 SMS。

        public boolean isAvailable(Context context, Intent intent) {
            final PackageManager mgr = context.getPackageManager();
            List<ResolveInfo> list = mgr.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
            return list.size() > 0;
        }
        

        取自developer.android.com

        并创建一个 Intent 进行检查,如下所示:

        Uri smsToUri = Uri.parse("smsto:");
        Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);
        if (isAvailable(intent)) {
            // do whatever you like.
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-29
          • 1970-01-01
          相关资源
          最近更新 更多