我是Android开发的新手,我正在创建一个应用程序,它接收一个格式为“获取名称”名称的短信作为地址簿中的联系人,并将名片返回给发件人。我已经添加了所有权限,但每当我发送消息“获取名称”时它似乎都会崩溃。虽然没有涉及函数调用,但它确实适用于无效命令
这是我的主要活动
public class MainActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
这是广播接收器
public class SmsReceiver extends BroadcastReceiver
{
String str="",phoneno="";
MainActivity object=new MainActivity();
@Override
public void onReceive(Context context, Intent intent)
{
//---get the SMS message passed in---
.
.
.
//---retrieve the SMS message received---
.
.
.
if(command.equalsIgnoreCase("get")){
try{
Intent start_contact_retrieve=new Intent();
start_contact_retrieve.setClass(context, ContactRetrieve.class);
context.startService(start_contact_retrieve);
context.stopService(start_contact_retrieve);
}
catch(Exception e){
Log.e("receiver function", e.getMessage());
}
//---display the new SMS message---
.
.
.
}
else{
SmsManager invalid_command=SmsManager.getDefault();
invalid_command.sendTextMessage(phoneno, null, "Invalid Command", null, null);
}
}
}
这是我正在打电话的服务
public class ContactRetrieve extends Service{
SmsReceiver sreceiver=new SmsReceiver();
String argument_name=sreceiver.str;
String argument_phoneno=sreceiver.phoneno;
@Override
public IBinder onBind(Intent arg0) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void onCreate() {
super.onCreate();
String returned_data=retrievecontact();
SmsManager smsman= SmsManager.getDefault();
smsman.sendTextMessage(argument_phoneno, null, returned_data, null, null);
}
public String retrievecontact(){
String phone="No Contact Found";
ContentResolver cr=getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
.
.
.
.
}
}
return phone;
}
}
我尝试在主要活动中调用此函数,但它也不起作用。该程序只是停止响应。过去两天我一直坚持这个问题。任何帮助将不胜感激。 P.S抱歉所有代码。
这是更新的代码......
@Override
public void onCreate() {
super.onCreate();
Thread t=new Thread(this);
t.start();
}
public String retrievecontact(){
String phone="No Contact Found";
try{
ContentResolver cr=getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
.
.
.
}
}
}
}
catch(Exception e){
Log.e("ERROR", e.getMessage());
}
return phone;
}
public void run() {
String returned_data=retrievecontact();
SmsManager smsman= SmsManager.getDefault();
smsman.sendTextMessage(argument_phoneno, null, returned_data, null, null);
stopSelf();
}
logcat的
??-?? ??:??:??.??? 0 INFO <unknown> [ 11-05 14:04:04.204 1571: 1585 E/AndroidRuntime ]
??-?? ??:??:??.??? 0 INFO <unknown> FATAL EXCEPTION: Thread-144
??-?? ??:??:??.??? 0 INFO <unknown> at android.minor_project.ContactRetrieve.run(ContactRetrieve.java:172)
??-?? ??:??:??.??? 0 INFO <unknown> [ 11-05 14:04:04.324 190: 291 W/ActivityManager ]
??-?? ??:??:??.??? 0 INFO <unknown> [ 11-05 14:04:04.343 190: 291 W/WindowManager ]
答案 0 :(得分:0)
您可能需要在清单文件中将权限声明为READ_CONTACTS,
<uses-permission android:name="android.permission.READ_CONTACTS"/>
答案 1 :(得分:0)
我建议做以下更改:
1)使用onStartCommand()
方法在服务中创建后台线程,并从线程的retrievecontact()
方法中调用run()
。由于服务也在进程man线程(UI线程)中运行,如果内容解析器花费时间,它也会使应用程序崩溃..
3)尝试将retrievecontact()
方法放在try catch中,看它是否引发任何异常。
4)从context.stopService(start_contact_retrieve);
课程中删除SMSReciever
。您不应该在启动它之后停止服务。而是在以下行后调用stopSelf()
:
SmsManager smsman= SmsManager.getDefault();
smsman.sendTextMessage(argument_phoneno, null, returned_data, null, null);
编辑1:
使用以下代码将名称从接收方发送到服务:
在广播接收器中:
Intent start_contact_retrieve=new Intent();
start_contact_retrieve.setClass(context, ContactRetrieve.class);
start_contact_retrieve.putExtra("contact_name", name_of_contact_retrived_from_sms);
context.startService(start_contact_retrieve);
在服务中:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String name = intent.getStringExtra("contact_name");
//start the thread and pass name as parameter to the retrieve method
return super.onStartCommand(intent, flags, startId);
}