以下是代码,用Debug测试的时候模拟器(2.3)可以成功得到数据,但是4.0系统的真机得到的cursor是null.
高手帮忙看看。Uri inboxUri = Uri.parse(Utils.SMS_URI); // 创建短信收件箱Uri对象
// Uri inboxUri = Uri.parse(Utils.INBOX_URI); // 创建短信收件箱Uri对象
ContentResolver resolver = mContext.getContentResolver();// 创建读取短信收件箱的ContentResolver对象 // 调用ContentResolver对象的查询方法获得游标
Cursor cursor = resolver.query(inboxUri, new String[] { "_id",
"address", "thread_id", "date", "protocol", "type", "body",
"read" }, // 返回的列
" address=?", // 查询条件
new String[] { safeNum },// 匹配条件
"date desc"); // 降序排列
if (cursor != null) {
while (cursor.moveToNext()) {
String smsBody = cursor
.getString(cursor.getColumnIndex("body"));
String id = cursor.getString(cursor.getColumnIndex("_id"));
// 这里没有判断当前是否处于保护状态,完善后看看要不要判断一下
password = sp.getString("password", "");
Log.i(Utils.TAG, "password==============="+password);
/**
 * 在执行操作前先在数据库中删掉该条短信,防止用户看到
 */
if (smsBody.contains("+" + password)) {
resolver.delete(Uri.parse(Utils.SMS_URI), "_id=?", new String[]{id});
Message msg = new Message();
// 如果接收到了定位命令,那么就发送定位短信到安全号码
if (("dingwei+" + password).equals(smsBody)) {
Log.i(Utils.TAG, "接收到了定位命令,发送定位短信到安全号码");
//将发送定位短信的请求封装到Message对象中通过handler传给主线程
msg.what = Utils.SEND_LOCATION_SMS;

}
// 如果接收到了删除命令,那么就删除手机通讯录
else if (("shanchu*" + password).equals(smsBody)) {
Log.i(Utils.TAG, "接收到了删除命令,删除手机通讯录");
msg.what = Utils.SEND_DELETE_SMS;
}
mHandler.sendMessage(msg);
}
break;
}

解决方案 »

  1.   

    是中兴的u950,已经root了,但是开发的这个应用没有申请root 权限,其他的收发读写短信权限都有,你的意思是我的这个应用必须获取到root权限才能读到短线数据库是吗?等我试一下。
      

  2.   

    是读取数据库的权限额。<uses-permission android:name="android.permission.READ_SMS"></uses-permission>  
     参考如下博客:http://blog.csdn.net/dearxiaofan/article/details/7252121
      

  3.   

        <uses-permission android:name="android.permission.RECEIVE_SMS" />
        <uses-permission android:name="android.permission.SEND_SMS" />
        <uses-permission android:name="android.permission.WRITE_SMS" />
        <uses-permission android:name="android.permission.READ_SMS" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    这些权限都有,而且2.3的模拟器上运行完全没问题。4.0系统中兴的手机上却读不出东西来。
      

  4.   

        <uses-permission android:name="android.permission.RECEIVE_SMS" />
         <uses-permission android:name="android.permission.SEND_SMS" />
         <uses-permission android:name="android.permission.WRITE_SMS" />
         <uses-permission android:name="android.permission.READ_SMS" />
         <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     这些权限都有,而且2.3的模拟器上运行完全没问题。4.0系统中兴的手机上却读不出东西来。
      

  5.   


    是中兴的u950,已经root了,但是开发的这个应用没有申请root 权限,其他的收发读写短信权限都有,你的意思是我的这个应用必须获取到root权限才能读到短线数据库是吗?等我试一下。
      

  6.   

    不是root权限,就是上面人说的manifest里声明的权限.你还是看一下logcat 有没有有用的log吧
      

  7.   

    权限方面原因有可能,把信息的provider和sqlitedatabase那部分代码导到一个工程里调试下,导成java工程也也行,大不了远程调试,看看你的查询是哪出问题了,query方法先打个断点慢慢调,很快的。