Pro Android学习笔记(一二一):Telephony API(3):读短信

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/flowingflying以及作者@恺风Wei

读短信需要READ_SMS的权限。

<uses-permission android:name="android.permission.READ_SMS" />

Content Provider的URI

通过content Provider可以读取短信。相关的URI如下:

  • 所有:   content://sms/all
  • 收件箱:content://sms/inbox
  • 已发送:content://sms/sent
  • 草稿箱:content://sms/draft
  • 发信箱:content://sms/outbox
  • 发送失败:content://sms/failed
  • 排队待发送:content://sms/queued
  • 未送达:content://sms/undelivered
  • 会话:   content://sms/conversations

彩信也可以通过content provider来获取,authority改为mms-sms即可,例如content://mms-sms/inbox。

通过content Provider可以获得cursor,每个元素即为一条短信,下面是常用的属性:

_id               一个自增字段,从1开始
thread_id    序号,同一发信人的id相同
address      发件人手机号码
person        联系人列表里的序号,陌生人为null
date            发件日期
protocol      协议,分为: 0 SMS_RPOTO, 1 MMS_PROTO
read           是否阅读 0未读, 1已读
status         状态 -1接收,0 complete, 64 pending, 128 failed
type            ALL = 0;INBOX  = 1; SENT = 2; DRAFT  = 3;OUTBOX = 4; FAILED = 5; QUEUED = 6;
body           短信内容
service_center     短信服务中心号码编号
subject       短信的主题

读取短信

小例子代码如下:

public class ReadSMSActivity extends ListActivity{
   @Override
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);         
        Cursor c = getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null);
        String[] columns = new String[] { "address","body" };
        int[] names = new int[] {android.R.id.text1,android.R.id.text2};
        
        ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2,
                c, columns, names, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
       
        setListAdapter(adapter);   
    }
}   

读取新收短信

短信的顺序是按时间反序排列,第一条短信即使最后接收的短信,我们需要的是在短信发生变化时,通过回调函数读取最后收到的短信。Content的内容,通过ContentProvider来获取,而Content的内容变化,则通过ContentObserver来获取。

public class SMSContentObserver extends ContentObserver{
    private Activity activity = null; 

    public SMSContentObserver(Handler handler, Activity activity) {
        super(handler);
        this.activity = activity;  
    }

    @Override //content发生变化的回调函数,可以直接通过该uri来获得该短信内容,或者读取全部的短信,获取其最新的一条。 
    public void onChange(boolean selfChange, Uri uri) { 
        super.onChange(selfChange, uri);
        getFirstSMS();
    }
   
    //通过content provider读取第一条短信 
    private void getFirstSMS(){
        Cursor c = activity.getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null);
        if(!c.moveToFirst())
            return;
        String address = c.getString(c.getColumnIndex("address"));
        String body = c.getString(c.getColumnIndex("body"));
        c.close();
        Toast.makeText(activity, "From " + address + ":\n" + body, Toast.LENGTH_LONG).show();
    }
}

我们在Activity中注册要观察内容变更,如下:

public class ReadSMSActivity extends ListActivity{
    … …    
    private SMSContentObserver observer = null;
    @Override
    protected void onResume() { 
       super.onResume();        
        observer = new SMSContentObserver(new Handler(),ReadSMSActivity.this);
       // 在测试中,如果填入content://sms/inbox,除一台4.1.2的设备起作用外,其他都不其作用
        getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, observer); 
    }

   @Override
    protected void onPause() { 
        super.onPause();
        getContentResolver().unregisterContentObserver(observer);
    } 
   
}

小例子代码在:Pro Android学习:telephony小例子

相关链接:我的Android开发相关文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java.lang.IllegalStateException: telephony service is null 是一个Java异常,表示电话服务为空的非法状态异常。这个异常通常在使用Android TelephonyManager类的方法时抛出。 TelephonyManager类是Android提供的用于访问与电话相关的信息和功能的类。它可以用于获取设备的电话状态、SIM卡信息、网络类型等。当调用TelephonyManager的方法时,如果没有正确初始化或者没有获取到电话服务,就会抛出这个异常。 要解决这个异常,可以按照以下步骤进行排查和修复: 1. 确保在使用TelephonyManager之前,已经获取了正确的权限。在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.READ_PHONE_STATE" /> ``` 2. 在使用TelephonyManager之前,先检查是否有电话服务可用。可以使用以下代码进行检查: ```java TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager == null) { throw new IllegalStateException("telephony service is null"); } ``` 3. 确保在使用TelephonyManager之前,已经正确初始化了上下文对象。可以使用以下代码获取上下文对象: ```java Context context = getApplicationContext(); ``` 如果以上步骤都正确无误,但仍然抛出 IllegalStateException 异常,可能是由于设备不支持电话功能或者其他系统相关问题导致的。可以尝试在其他设备上测试,或者查阅相关文档和资料进行更深入的排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值