Java android编程中的传入短信列表
嗨,我想写一个程序,接收传入的短信,并列出他们 但我有个问题 当收到短信时,它不能在活动列表中,当我打开活动时,程序停止 我有两个类:ReceiveMessage和SmsInbox 接收信息: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
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的副本,非常感谢您的回复。