情况是这个样子滴:
可以读取手机上的短信,可以读取SIM卡上的联系人,就是读不到SIM卡上的短信,也设置权限了, <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 还是读不到,myCursor 返回的是null。
为什么就读不到呢?
package simok.ok;import android.app.Activity;
import android.os.Bundle;
import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.Contacts.People;
import android.util.Log;
import android.widget.Toast;
import android.telephony.TelephonyManager;
import android.content.Context;
import android.content.Intent;
import android.telephony.gsm.*;
import android.content.Intent;
import android.widget.TextView; 
import android.telephony.gsm.SmsMessage;
import android.database.sqlite.SQLiteException;   
import android.net.Uri;  @SuppressWarnings("unused")
public class simok extends Activity {
private static final String LOG_TAG = "Sms Query";
//private TelephonyManager telMgr;
//String TAG = "GameScene";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);   
     setContentView(R.layout.main);   
     //telMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE)   
     getSmsAndSendBack();
    }
    public void getSmsAndSendBack()  
    {   
       String[] projection = new String[] {"_id","address","person","body" };   
       //StringBuilder str=new StringBuilder();          
      // Cursor myCursor = cr.query(Uri.parse("content://sms/inbox"),projection,null, null ,null);
       //Uri uri = Uri.parse("content://sms/icc"); 
       //Cursor myCursor = managedQuery(Uri.parse("content://sms/inbox"),projection,null, null ,null);
       //Cursor myCursor = managedQuery(Uri.parse("content://sms/icc"),projection,null, null ,null);
       Cursor myCursor = managedQuery(Uri.parse("content://icc/adn"),projection,null, null ,null);
      // Log.v(TAG, "onTouchDownReal()");
       processResults(myCursor);
    }
    private void processResults(Cursor cur)
    {    
        if (cur.moveToFirst())
     //int count=cur.getCount();
     //cur.moveToFirst();
     //for(int i=0;i<count;i++)
        {   
              String name;    
              String phoneNumber;          
              String sms;   
              int nameColumn = cur.getColumnIndex("person");  
              int phoneColumn = cur.getColumnIndex("address"); 
              int smsColumn = cur.getColumnIndex("body");          
             do {     
                  name = cur.getString(nameColumn);                
                  phoneNumber = cur.getString(phoneColumn);   
                  sms = cur.getString(smsColumn);  
                  Log.i(LOG_TAG,"name="+name);
                  Log.i(LOG_TAG,"phoneNumber="+phoneNumber);
                  Toast.makeText(this,name+""+phoneNumber+""+sms,Toast.LENGTH_LONG).show();
              } while (cur.moveToNext());  
          }  
     //cur.moveToNext();
        else
        { Toast.makeText(this,"你好",Toast.LENGTH_LONG).show();}
     }//processResults 
    
   // public final static String SMS_URI_ALL =  "content://sms/"; //0      
    //public final static String SMS_URI_INBOX = "content://sms/inbox";//1      
    public final static String SMS_URI_SEND = "content://sms nt";//2      
    public final static String SMS_URI_DRAFT = "content://sms/draft";//3      
    public final static String SMS_URI_OUTBOX = "content://sms/outbox";//4      
    public final static String SMS_URI_FAILED = "content://sms/failed";//5      
    public final static String SMS_URI_QUEUED = "content://sms/queued";//6   
    //public final static String SMS_ICC        = "content://sms/icc";//23   }

解决方案 »

  1.   

    http://hi.baidu.com/dhqway/blog/item/d32cccd8e4fb863b33fa1c9e.htmlUri uri = Uri.parse("content://sms/icc"); 
    String[] projection = null;//new String[]{"name","number"};
    String   selection = null;
    String[] selectionArgs = null;
    String sortOrder = null;
    Cursor c2 = managedQuery(uri, projection, selection, selectionArgs, sortOrder);
    c2.moveToFirst();
      

  2.   

    想问一下,在模拟器上能跑着类的程序吗,我的意思是,模拟器上没有sim卡,不可能读到什么sim卡上的联系人什么的,怎么会有结果显示呢?这类程序还得在真机上测吧?模拟器上是测不出什么的吧?
      

  3.   

    我觉得吧,楼主,你的这种方法是读取不了Sim卡上的短信的。我这里用其他的方法实现了。不过现在有问题,不能够删除短信。
    给你提供点思路,就是你看看SmsManager这个类。或许对你有帮助。
      

  4.   

    把设置改成 4 不用再运行一下吗?改了保存后给他bin目录下的apk就行了吗?
      

  5.   

    楼主,我的代码很简单的,
    sms = mSmsManager.getAllMessagesFromIcc();这句话可以读出所有的Sim卡上的短信,读出以后是保存在sms这个数组里面的。
      

  6.   

     关键是我不能访问getAllMessagesFromIcc();啊
      

  7.   

    读取是有方法的,网上有很多的,SmsManager类下有个方法getAllMessagesFromIcc(),他返回短信的列表,你好好研究研究,
    SmsManager smger = null;
    smger =SmsManager.getDefault() ;
    list = smger.getAllMessagesFromIcc();我原来不知道怎么访问这个getAllMessagesFromIcc()方法,说到这因该明白了吧,建议你看看源码,我是帮别人看的,没细研究,但是告诉你这些,读是没问题的。
      

  8.   

    为什么我只能读取到SIM卡上收到的信息,而读不到发出的信息呢?
      

  9.   

    Uri uri = Uri.parse("content://sms/icc"); 
            String[] projection = new String[]{"service_center_address","address","message_class","body","date","status","index_on_icc",
                    "is_status_report","transport_type","type","locked","error_code","_id"};
            String   selection = null;
            String[] selectionArgs = null;
            String sortOrder = null;
            Cursor cursor = managedQuery(uri, projection, selection, selectionArgs, sortOrder);
            cursor.moveToFirst();
    好像是只能获取到收件箱~