1

ああ、私はズボンを脱いでグーグルで検索しましたが、数日間エラーが発生しませんでした.

要するに、メッセージdevice :コマンドを含む SMS を受信したいので、たとえば SPA:ON

私のアプリは非常にシンプルです。私がしたいのは、MainActivity でデバイスのステータスを表示するテキストを変更することだけです (つまり、XML の @string/somevalue を変更します)。これにより、SPA:ON メッセージを受信したときに TextView が表示されるようになります。 OFF の初期文字列から ON の新しいコマンド テキストに変更されます。

以下の私のコードを考えると、これを行う最良の方法は何ですか??

それが不可能な場合 - どうすればよいですか?

ありがとう

public class MainActivity extends Activity {

    private static Button buttonSend;
    private static EditText textPhoneNo;
    private static EditText textSMS;
    private static Context context;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        buttonSend = (Button) findViewById(R.id.buttonSend);
        textPhoneNo = (EditText) findViewById(R.id.editTextPhoneNo);
        textSMS = (EditText) findViewById(R.id.editTextSMS);

        buttonSend.setOnClickListener(new OnClickListener() {

            @Override
        public void onClick(View v) {   

            String phoneNo = textPhoneNo.getText().toString();
            String sms = textSMS.getText().toString();  

            if (phoneNo.length()>0 && sms.length()>0) 
            {
                sendSMS(phoneNo, sms);
            }
            else
            {
                Toast.makeText(getBaseContext(), 
                    "Please enter both phone number and message.", 
                    Toast.LENGTH_SHORT).show();
            }
        }
        });
    }  

    //---sends a SMS message to another device---
    public void sendSMS(String phoneNo, String message) {      

        String SENT = "SMS_SENT";
        String DELIVERED = "SMS_DELIVERED";

        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
            new Intent(SENT), 0);

        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);

        //---when the SMS has been sent---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context context, Intent intent) {
                switch (getResultCode())
                {
                case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "SMS sent", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.makeText(getBaseContext(), "Generic failure", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Toast.makeText(getBaseContext(), "No service", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.makeText(getBaseContext(), "Null PDU", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.makeText(getBaseContext(), "Radio off", 
                                Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter(SENT));

        //---when the SMS has been delivered---
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context context, Intent intent) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "SMS delivered", 
                                Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        Toast.makeText(getBaseContext(), "SMS not delivered", 
                                Toast.LENGTH_SHORT).show();
                        break;                      
                }
            }
        }, new IntentFilter(DELIVERED));         

        try 
        {
            SmsManager sms = SmsManager.getDefault();
            sms.sendTextMessage(phoneNo, null, message, sentPI, deliveredPI);
        } 
    catch (Exception e) 
        {
            Toast.makeText(getApplicationContext(),
                "SMS faild, please try again.",
                Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }       
}

受信する (そしてテキスト更新を試みる) SMS コードは次のとおりです。

public class SmsReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        //---get the SMS message passed in---
    Bundle bundle = intent.getExtras();        
    SmsMessage[] msgs = null;
    String str = "";    

    if (bundle != null)
    {
        //---retrieve the SMS message received---
        Object[] pdus = (Object[]) bundle.get("pdus");
        msgs = new SmsMessage[pdus.length];  

        for (int i=0; i<msgs.length; i++){
            msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
            str += "SMS from :" + msgs[i].getOriginatingAddress();                     
            str += " :";
            str += msgs[i].getMessageBody().toString();
            str += "\n";        
        }
        //---display the new SMS message---
        Toast.makeText(context, str, Toast.LENGTH_LONG).show(); 

        //---update the device status from the command---
        /* SOME HOW I WANT TO DO:

        String toast_msg = "None";
        String temp[];
        temp = str.split("\\:");
        String device = temp[0];
        String cmd = temp[1];

        TextView t = (TextView) findViewById(R.id.textViewSPAStatus);

        t.setText(cmd);

        Toast.makeText(getBaseContext(), 
                toast_msg, 
                Toast.LENGTH_SHORT).show(); 
        */
    }                       
}
}
4

1 に答える 1

0

xml を変更することはできません。これらの値は xml に対して永続的です。代わりに使用できるもの:

  • 共有設定
  • SQLite データベース
  • ファイル

SharedPreferencesはセットアップが最も簡単で、非常にうまく機能します。Preferences というテキストは名前の一部ですが、単純なキーと値のペアのストレージ オプションであるため、設定に限定されません。したがって、設定後、アプリはこれを集中型の「コマンド テキスト」データベースとして使用します。これは、アクティビティが作成/再開されたときに、SharedPreferences が持っているもので TextView を更新することを意味します。SharedPreferences の優れた点は、コマンド専用の単純なデータベースを個別に作成できることです。ユーザーがアプリのデータを削除しない限り、再起動や終了などでアプリが保持する必要がある値の最も安全なストレージ オプションの 1 つです。

また、受信者がすべてのメッセージを確実に受信できるようにするには、受信者を登録するバックグラウンド サービスを作成することを検討してください。

于 2012-12-06T02:08:43.313 に答える