Android 如何检测设备是否能够呼叫和发送消息

Android 如何检测设备是否能够呼叫和发送消息,android,telephony,Android,Telephony,一些设备,如Galaxy Tablet 10.1,只能发送短信,但不能通话。其他一些设备,如华硕Transformer,甚至没有SIM卡 如何检测设备是否可以拨打电话?如何检测设备是否可以发送短信?使用此技术,您还可以测试各种东西,例如指南针、位置是否可用 PackageManager pm = getBaseContext().getPackageManager(); pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);

一些设备,如Galaxy Tablet 10.1,只能发送短信,但不能通话。其他一些设备,如华硕Transformer,甚至没有SIM卡


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

使用此技术,您还可以测试各种东西,例如指南针、位置是否可用

    PackageManager pm = getBaseContext().getPackageManager();
    pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
这应该做到:

 PackageManager pm = this.getPackageManager();

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

也许您可以确定系统是否包含任何可以响应ACTION\u调用和ACTION\u SENDTO意图的组件?您可能需要在URI中添加“tel:”和“smsto:”方案。

您只需将代码包装在try/catch中即可。它在所有情况下都能工作,即使是最近关于sms发送的api更改

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

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

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

这里是我做的检查是短信可用

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

它对SMS没有帮助,是吗?不幸的是,这会在一些电话设备和模拟器上造成误判。我知道这个问题很老了,但我想澄清一下这段代码,以防将来有人找到这个答案:这段代码显示设备是否能够使用电话功能,但这并不意味着它现在就可以打电话或发短信。例如,如果您在没有SIM卡的手机上运行此代码(显然是一个无法拨打电话或发送短信的设备),尽管没有SIM卡,它仍将返回
true
。这在一些实际上能够拨打电话的平板电脑上不起作用。它对短信没有帮助,是吗?事实上应该是这样的,因为SMS不使用数据连接,而是像电话一样使用2G是的,但正如我所说的。Galaxy Tab 10.1可以发送短信,但不能呼叫。那么,我如何区分这两件事呢?不过,这在检测短信功能方面存在问题。如果一个设备安装了谷歌语音,即使它没有任何电话功能,它仍然可以发送短信。所以这种方法可能会给你错误的否定。除非存在更好的方法,否则在我看来,最好的方法就是正常地准备SMS意图,将其传递给startActivity(),然后捕获ActivityNotFoundException。这样,如果它失败了,至少它会正常地失败,并且您可以显示一条错误消息,显示失败的原因。我在两天前还在考虑这个问题,但我还没有时间尝试,测试它。当然,这就是解决问题的方法。不过,平板电脑似乎确实对ACTION_-DIAL之类的产品有反应。它们会显示一个小对话框,让您可以选择将号码添加到联系人中。所以我怀疑这会起作用。
Uri smsToUri = Uri.parse("smsto:");
Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);
if (isAvailable(intent)) {
    // do whatever you like.
}