0

私はAndroid開発に非常に慣れていないので、アドレス帳の連絡先である「名前を取得」形式のSMSを受信し、送信者に名刺を返すアプリを作成しています。すべての権限を追加しましたが、「名前を取得」というメッセージを送信するたびにクラッシュするようです。関数呼び出しが含まれていないため、無効なコマンドでも機能します

これが私の主な活動です

    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;
} 

}

メインアクティビティ自体でこの関数を呼び出してみましたが、どちらも機能しません。プログラムが応答を停止します。過去2日間、この問題に悩まされています。どんな助けでも大歓迎です。PSすべてのコードで申し訳ありません。

これは更新されたコードです....

@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();
}

ログキャット

     ??-?? ??:??:??.??? 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 ]
4

2 に答える 2

0

マニフェスト ファイルで READ_CONTACTS へのアクセス許可を宣言する必要がある場合があります。

<uses-permission android:name="android.permission.READ_CONTACTS"/>
于 2012-11-05T07:42:59.613 に答える
0

次の変更を行うことをお勧めします。

1) メソッドでサービスにバックグラウンド スレッドを作成し、スレッドのメソッドからonStartCommand()呼び出します。サービスもプロセスのマン スレッド (UI スレッド) で実行されるため、コンテンツ リゾルバーに時間がかかっているとアプリがクラッシュすることもあります。retrievecontact()run()

3)retrievecontact()メソッドを try catch に入れて、例外が発生しているかどうかを確認します。

context.stopService(start_contact_retrieve);4) クラスから削除し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);
}
于 2012-11-05T07:44:59.430 に答える