为什么我的短信验证码无法正常使用?

时间:2017-03-30 19:53:51

标签: android sharedpreferences

我想我有点陷入困境。我制作的应用程序通过向用户输入的号码发送短信来验证用户的电话号码,然后检查 - 这样一来,它肯定是用户的电话号码。此活动应该只在开始时出现一次 - 供用户验证,然后应该加载活动2。

我正在尝试这样做:

//  when the form loads, check to see if phoneNo is in there
SharedPreferences sharedPreferences = getSharedPreferences("MyData", Context.MODE_PRIVATE);
String phoneNoCheck = sharedPreferences.getString("phonenumber","");

if (phoneNoCheck != null) {
    //  if it is in there, start the new Activity
    Intent myIntent = new Intent(MainActivity.this, PopulistoContactList.class);
    MainActivity.this.startActivity(myIntent);

}

但它似乎没有正常运作。首先,我甚至不确定它应该是null。当我关闭手机并再次打开时,它会从活动1开始,要求验证。

我无法测试它。我需要在设备上运行该应用,因为我无法从模拟器发送短信,而且我无法访问设备上存在sharedPreferences的文件,因此我可以&# 39;甚至看看它是否写得正确。

有关如何在手机上查看MyData.xml并继续测试我的应用程序或告诉我如何改进代码的任何建议?我下载了Astro应用程序,但仍然无法找到它。

这是我的代码:

package com.example.chris.tutorialspoint;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.app.Activity;
import android.provider.Telephony;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.tutorialspoint.R;

public class MainActivity extends Activity {
    Button sendBtn;
    EditText txtphoneNo;

    String phoneNo;
    String origNumber;

    private BroadcastReceiver receiver;

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

        sendBtn = (Button) findViewById(R.id.btnSendSMS);
        txtphoneNo = (EditText) findViewById(R.id.editText);

        //  when the form loads, check to see if phoneNo is in there
        SharedPreferences sharedPreferences = getSharedPreferences("MyData", Context.MODE_PRIVATE);
        String phoneNoCheck = sharedPreferences.getString("phonenumber","");

        if (phoneNoCheck != null) {
            //  if it is in there, start the new Activity
            Intent myIntent = new Intent(MainActivity.this, PopulistoContactList.class);
            MainActivity.this.startActivity(myIntent);

        }

        //if it is not in there, proceed with phone number verification

        else {
            sendBtn.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) {
                    sendSMSMessage();
                }
            });

            IntentFilter filter = new IntentFilter();
//        the thing we're looking out for is received SMSs
            filter.addAction("android.provider.Telephony.SMS_RECEIVED");

            receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent)

                {
                    Bundle extras = intent.getExtras();

                    if (extras == null)
                        return;

                    Object[] pdus = (Object[]) extras.get("pdus");
                    SmsMessage msg = SmsMessage.createFromPdu((byte[]) pdus[0]);
                    origNumber = msg.getOriginatingAddress();

                    Toast.makeText(getApplicationContext(), "Originating number" + origNumber, Toast.LENGTH_LONG).show();
                    Toast.makeText(getApplicationContext(), "Sent to number" + phoneNo, Toast.LENGTH_LONG).show();

                }

            };
            registerReceiver(receiver, filter);
        }
    }



    protected void sendSMSMessage() {
        phoneNo = txtphoneNo.getText().toString();

        //this is the SMS received
        String message = "Verification test code. Please ignore this message. Thank you.";

        try {
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(phoneNo, null, message, null, null);
            Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show();

            //if originating phone number is the same as the sent to number, save
            //and go to the next activity
            if (origNumber.equals(phoneNo)) {
                //save the phone number
                SharedPreferences sharedPreferences = getSharedPreferences("MyData", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putString("phonenumber", phoneNo);
                editor.commit();

                Intent myIntent = new Intent(MainActivity.this, PopulistoContactList.class);
                MainActivity.this.startActivity(myIntent);
            }
        }

        catch (Exception e) {
            Toast.makeText(getApplicationContext(), "SMS failed, please try again.", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        if (receiver != null) {
            unregisterReceiver(receiver);
            receiver = null;
        }
        super.onDestroy();
    }

1 个答案:

答案 0 :(得分:1)

您期望在这里发生什么:

String phoneNoCheck = sharedPreferences.getString("phonenumber","");

if (phoneNoCheck != null) {

    ...
}

您正在调用的方法getString(String, String)使用第二个参数作为默认值,也就是说,如果未找到任何属性,则默认为,如您所定义的,为空字符串{{ 1}}。

然后尝试将其与""进行比较,null永远不会相等。

尝试将其更改为以下内容:

String phoneNoCheck = sharedPreferences.getString("phonenumber", null);

// check if null or empty
if ( null == phoneNoCheck || phoneNoCheck.equals("") ) {

    // unregistered
}