마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

핸드폰 SMS 인증 오류

0 추천
package com.example.test1;
import android.Manifest;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.util.Random;

public class MainActivity extends AppCompatActivity{
    Button SendSMSBt, CheckBt;
    EditText InputPhoneNum, InputCheckNum;
    String checkNum;

    static final int SMS_SEND_PERMISSION = 1;

    SharedPreferences pref = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = pref.edit();

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

        SendSMSBt = (Button) findViewById(R.id.send_sms_button);
        InputPhoneNum = (EditText) findViewById(R.id.input_phone_num);

        CheckBt = (Button) findViewById(R.id.check_button);
        InputCheckNum = (EditText) findViewById(R.id.input_check_num);

        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS);
        if(permissionCheck != PackageManager.PERMISSION_GRANTED){
            if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.SEND_SMS)){
                Toast.makeText(getApplicationContext(),"SMS 권한이 필요합니다", Toast.LENGTH_SHORT).show();
            }
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS},SMS_SEND_PERMISSION);
        }

        SendSMSBt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkNum = numberGen(4,1);
                editor.putString("checkNum",checkNum);
                sendSMS(InputPhoneNum.getText().toString(),"인증번호 : "+checkNum);
            }
        });

        CheckBt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(pref.getString("checkNum","").equals(InputCheckNum.getText().toString())){
                    Toast.makeText(getApplicationContext(),"인증 완료 되었습니다.", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(getApplicationContext(),"인증번호가 일치하지 않습니다.",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void sendSMS(String PhoneNumber, String Message){
        PendingIntent pi = PendingIntent.getActivity(this, 0,
                new Intent(this, MainActivity.class), 0);
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(PhoneNumber, null, Message, pi, null);

        Toast.makeText(getBaseContext(), "메시지가 전송 되었습니다.", Toast.LENGTH_SHORT).show();
    }

    public static String numberGen(int len, int dupCd){

        Random rand = new Random();
        String numStr = "";

        for(int i=0; i<len; i++){
            String ran = Integer.toString(rand.nextInt(10));

            if(dupCd==1){
                numStr += ran;
            }else if(dupCd==2){
                if(!numStr.contains(ran)){
                    numStr += ran;
                }else{
                    i-=1;
                }
            }
        }
        return numStr;
    }

}

제가 아무리 해도 avd가 자꾸 꺼지면서 디버깅 오류가 나옵니다..ㅠㅠㅠㅠㅠ

코린이인데 한번만 도움주시면 고마울 것 같아요...

도와주세요
Ruruandroid (140 포인트) 님이 2022년 7월 13일 질문
이건 디버깅 오류 입니다...!!!

2022-07-13 19:56:25.202 8933-8933/com.example.test1 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.test1, PID: 8933
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.test1/com.example.test1.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3365)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.content.ContextWrapper.getPackageName(ContextWrapper.java:149)
        at android.app.Activity.getLocalClassName(Activity.java:6738)
        at android.app.Activity.getPreferences(Activity.java:6782)
        at com.example.test1.MainActivity.<init>(MainActivity.java:28)
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1253)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3353)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

1개의 답변

0 추천
에러로그도 올려보세요. 그리고 왜 SMS 인증을 받는데 서버를 거치지 않고 모발앱에서 SMS를 보내는지 궁금하니요. SMS 인증같은 2FA는 서버에서 인증코드를 생성해서 디바이스로 전달하는게 보통인데 말이죠
spark (227,470 포인트) 님이 2022년 7월 13일 답변
spark님이 2022년 7월 13일 수정
...