Java android编程中的传入短信列表

Java android编程中的传入短信列表,java,android,sms,Java,Android,Sms,嗨,我想写一个程序,接收传入的短信,并列出他们 但我有个问题 当收到短信时,它不能在活动列表中,当我打开活动时,程序停止 我有两个类:ReceiveMessage和SmsInbox 接收信息: public class ReceiveMessage extends BroadcastReceiver { final SmsManager mysms = SmsManager.getDefault(); @Override public void onReceive(Context cont

嗨,我想写一个程序,接收传入的短信,并列出他们

但我有个问题

当收到短信时,它不能在活动列表中,当我打开活动时,程序停止

我有两个类:ReceiveMessage和SmsInbox

接收信息:

 public class ReceiveMessage extends BroadcastReceiver {

final SmsManager mysms = SmsManager.getDefault();
@Override
public void onReceive(Context context, Intent intent) {

    Bundle mybundel = intent.getExtras();
    try {

        if(mybundel !=null){
            final Object[] messageContent=(Object[])mybundel.get("pdus");
            String smsMessageStr = "";
            for (int i=0;i<messageContent.length;i++){

                SmsMessage mynewsms = SmsMessage.createFromPdu((byte[])    messageContent[i]);
                NewMessageNotification nome = new  NewMessageNotification();
                nome.notify(context,mynewsms.getDisplayOriginatingAddress(),mynewsms.getDisplayMessageBody(),i);
                i++;

                String smsBody = mynewsms.getMessageBody().toString();
                String address = mynewsms.getOriginatingAddress();

                smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";
            }
            Toast.makeText(context, smsMessageStr, Toast.LENGTH_SHORT).show();

            //this will update the UI with message
            SmsInbox inst = SmsInbox.instance();
            inst.updateList(smsMessageStr);
        }
    }
    catch (Exception ex){

    }
}
公共类ReceiveMessage扩展了BroadcastReceiver{
final smsmsmanager mysms=smsmsmanager.getDefault();
@凌驾
公共void onReceive(上下文、意图){
Bundle mybundel=intent.getExtras();
试一试{
如果(mybundel!=null){
最终对象[]消息内容=(对象[])mybundel.get(“PDU”);
字符串SMSMessagester=“”;
对于(int i=0;i您应该添加

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

到android清单。 正如您在日志中看到的,这是一个权限拒绝异常

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ces.cesday">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_SMS"/> //add this line only
    <application
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"

        android:theme="@style/AppTheme">

//只添加这一行
及 在SmsInbox中,更改为此

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sms_inbox);
    smsListView = (ListView) findViewById(R.id.SmsList);
    arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, smsMessagesList);
    smsListView.setAdapter(arrayAdapter);
    smsListView.setOnItemClickListener(this);
if(ContextCompat.checkSelfPermission(getBaseContext(), "android.permission.READ_SMS") == PackageManager.PERMISSION_GRANTED) {

    ContentResolver cr = getContentResolver();
    Cursor cursor = cr.query(Uri.parse("content://sms/inbox"), null, null,
            null, null);

    int indexBody = cursor.getColumnIndex("body");
    int indexAddr = cursor.getColumnIndex("address");

    if (indexBody < 0 || !cursor.moveToFirst()) return;
    arrayAdapter.clear();
    do {
        String str = "SMS From: " + cursor.getString(indexAddr) +
                "\n" + cursor.getString(indexBody) + "\n";
        arrayAdapter.add(str);
    } while (cursor.moveToNext());
}

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();
    toggle.setDrawerIndicatorEnabled(false);

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);


}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u sms\u收件箱);
smsListView=(ListView)findViewById(R.id.SmsList);
arrayAdapter=新的arrayAdapter(这是android.R.layout.simple_list_item_1,SMSMessageList);
设置适配器(arrayAdapter);
smsListView.setOnItemClickListener(此);
if(ContextCompat.checkSelfPermission(getBaseContext(),“android.permission.READ\u SMS”)==PackageManager.permission\u provided){
ContentResolver cr=getContentResolver();
Cursor=cr.query(Uri.parse(“content://sms/inbox空,空,,
空,空);
int indexBody=cursor.getColumnIndex(“body”);
int indexAddr=cursor.getColumnIndex(“地址”);
if(indexBody<0 | |!cursor.moveToFirst())返回;
arrayAdapter.clear();
做{
String str=“SMS From:”+cursor.getString(indexAddr)+
“\n”+游标.getString(indexBody)+”\n”;
arrayAdapter.add(str);
}while(cursor.moveToNext());
}
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
ActionBarDrawerToggle切换=新建ActionBarDrawerToggle(
这,抽屉,工具栏,R.string.navigation\u drawer\u open,R.string.navigation\u drawer\u close);
抽屉。添加抽屉链接器(切换);
toggle.syncState();
toggle.setDrawerIndicatorEnabled(false);
NavigationView NavigationView=(NavigationView)findViewById(R.id.nav_视图);
navigationView.setNavigationItemSelectedListener(此);
}
您应该添加

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

到android清单。 正如您在日志中看到的,这是一个权限拒绝异常

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ces.cesday">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_SMS"/> //add this line only
    <application
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"

        android:theme="@style/AppTheme">

//只添加这一行
及 在SmsInbox中,更改为此

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sms_inbox);
    smsListView = (ListView) findViewById(R.id.SmsList);
    arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, smsMessagesList);
    smsListView.setAdapter(arrayAdapter);
    smsListView.setOnItemClickListener(this);
if(ContextCompat.checkSelfPermission(getBaseContext(), "android.permission.READ_SMS") == PackageManager.PERMISSION_GRANTED) {

    ContentResolver cr = getContentResolver();
    Cursor cursor = cr.query(Uri.parse("content://sms/inbox"), null, null,
            null, null);

    int indexBody = cursor.getColumnIndex("body");
    int indexAddr = cursor.getColumnIndex("address");

    if (indexBody < 0 || !cursor.moveToFirst()) return;
    arrayAdapter.clear();
    do {
        String str = "SMS From: " + cursor.getString(indexAddr) +
                "\n" + cursor.getString(indexBody) + "\n";
        arrayAdapter.add(str);
    } while (cursor.moveToNext());
}

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();
    toggle.setDrawerIndicatorEnabled(false);

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);


}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u sms\u收件箱);
smsListView=(ListView)findViewById(R.id.SmsList);
arrayAdapter=新的arrayAdapter(这是android.R.layout.simple_list_item_1,SMSMessageList);
设置适配器(arrayAdapter);
smsListView.setOnItemClickListener(此);
if(ContextCompat.checkSelfPermission(getBaseContext(),“android.permission.READ\u SMS”)==PackageManager.permission\u provided){
ContentResolver cr=getContentResolver();
Cursor=cr.query(Uri.parse(“content://sms/inbox空,空,,
空,空);
int indexBody=cursor.getColumnIndex(“body”);
int indexAddr=cursor.getColumnIndex(“地址”);
if(indexBody<0 | |!cursor.moveToFirst())返回;
arrayAdapter.clear();
做{
String str=“SMS From:”+cursor.getString(indexAddr)+
“\n”+游标.getString(indexBody)+”\n”;
arrayAdapter.add(str);
}while(cursor.moveToNext());
}
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
抽屉=(抽屉布局)findViewById(R.id.抽屉布局);
ActionBarDrawerToggle切换=新建ActionBarDrawerToggle(
这,抽屉,工具栏,R.string.navigation\u drawer\u open,R.string.navigation\u drawer\u close);
抽屉。添加抽屉链接器(切换);
toggle.syncState();
toggle.setDrawerIndicatorEnabled(false);
NavigationView NavigationView=(NavigationView)findViewById(R.id.nav_视图);
navigationView.setNavigationItemSelectedListener(此);
}

请将stacktrace以文本而非图像的形式发布。拒绝权限通常意味着您忘记了权限(无论是否在运行时)。我的朋友AxelH和Codfather可能重复,非常感谢您的回复。请将stacktrace以文本而非图像的形式发布。拒绝权限通常意味着您忘记了权限(运行时与否)。可能是我的朋友AxelH和Codfather的副本,非常感谢您的回复。