>source

그래서 안드로이드 개발에 대한 초보자이고 sms Reciever 앱을 만들려고 하지만 작동하지 않습니다. 브로드캐스트 수신기가 들어오는 메시지를 캡처하고 표시할 수 있도록 Recycler 보기에 전달하기를 원합니다... 현재 아무 것도 표시되지 않습니다.

여기 내 code(매니페스트 파일)가 있습니다.

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test1">    <uses-permission android:name="android.permission.RECEIVE_SMS" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.READ_SMS" />    <uses-permission android:name="android.permission.READ_SMS" />    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Test1">        <receiver
            android:name=".SmsReceiver"
            android:enabled="true"
            android:exported="true"></receiver>        <activity
            android:name=".MainActivity"
            android:exported="true">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

여기에 MainActivity 파일이 있습니다.

package com.example.test1;
    import android.content.ContentResolver;
    import android.content.pm.PackageManager;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    import java.util.ArrayList;
    public class MainActivity extends AppCompatActivity {
        //recycler view
        private RecyclerView recyclerView;
         private ArrayList<SmsModel>smsModel=new ArrayList<>();
        private static MainActivity inst;
        public static MainActivity instance() {
            return inst;
        }
    @Override
    public void onStart() {
        super.onStart();
        inst= this;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView=findViewById(R.id.smsRecycler);
        ArrayAdapter adapter= new ArrayAdapter();
        adapter.setSmsModel(smsModel);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        if(ContextCompat.checkSelfPermission(getBaseContext(), "android.permission.READ_SMS")== PackageManager.PERMISSION_GRANTED) {
            refreshSmsInbox();
        }else {
            //Todo : Then Set Permission
            final int REQUEST_CODE_ASK_PERMISSIONS= 123;
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{"android.permission.READ_SMS"}, REQUEST_CODE_ASK_PERMISSIONS);
        }
        }
    public void refreshSmsInbox() {
        ContentResolver contentResolver= getContentResolver();
        Cursor smsInboxCursor= contentResolver.query(Uri.parse("content://sms/inbox"), null, null, null, null);
        int indexBody= smsInboxCursor.getColumnIndex("body");
        int indexAddress= smsInboxCursor.getColumnIndex("address");
        if (indexBody < 0 || !smsInboxCursor.moveToFirst()) return;
        smsModel.clear();
        do {
            String str= "SMS From: " + smsInboxCursor.getString(indexAddress) +
                    "\n" + smsInboxCursor.getString(indexBody) + "\n";
            smsModel.add((SmsModel) smsInboxCursor);
        } while (smsInboxCursor.moveToNext());
    }
    public void updateList(final String smsMessage) {
    }
}

여기 Recyclerview 어댑터 클래스가 있습니다.

package com.example.test1;
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
    import java.util.ArrayList;
    import java.util.List;
    public class ArrayAdapter extends RecyclerView.Adapter<ArrayAdapter.viewHolder> {
        private ArrayList<SmsModel>smsModel=new ArrayList<>();
        public ArrayAdapter() {
        }
        @NonNull
        @Override
        public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.smsview,parent,false);
            viewHolder viewHolder=new viewHolder(view);
            return viewHolder;
        }
        @Override
        public void onBindViewHolder(@NonNull viewHolder holder, int position) {
            holder.ContactsNO.setText(smsModel.get(position).getContactNumber());
            holder.SmsText.setText(smsModel.get(position).getContactSms());
            holder.Time.setText(smsModel.get(position).getTime());
            holder.Number.setText(smsModel.get(position).getNumber());
        }
        @Override
        public int getItemCount() {
            return smsModel.size();
        }
        public void setSmsModel(ArrayList<SmsModel> smsModel) {
            this.smsModel= smsModel;
            notifyDataSetChanged();
        }
        public class viewHolder extends RecyclerView.ViewHolder {
            private TextView ContactsNO;
            private TextView SmsText;
            private TextView Time;
            private TextView Number;
            public viewHolder(@NonNull View itemView) {
                super(itemView);
                ContactsNO=itemView.findViewById(R.id.contactsNo);
                SmsText=itemView.findViewById(R.id.smsText);
                Time=itemView.findViewById(R.id.time);
                Number=itemView.findViewById(R.id.Number);
            }
        }
    }

여기 내 SMS 수신기 클래스가 있습니다.

package com.example.test1;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
public class SmsReceiver extends BroadcastReceiver {
    public static final String SMS_BUNDLE= "pdus";
    @RequiresApi(api= Build.VERSION_CODES.M)
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle intentExtras= intent.getExtras();
        if (intentExtras != null) {
            Object[] sms= (Object[]) intentExtras.get(SMS_BUNDLE);
            String smsMessageStr= "";
            for (int i= 0; i < sms.length; ++i) {
                SmsMessage smsMessage= SmsMessage.createFromPdu((byte[]) sms[i]);
                String smsBody= smsMessage.getMessageBody().toString();
                String address= smsMessage.getOriginatingAddress();
                smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";
            }
            Toast.makeText(context, smsMessageStr, Toast.LENGTH_SHORT).show();
            //this will update the UI with message
            MainActivity inst= MainActivity.instance();
            inst.updateList(smsMessageStr);
            }
        }
    }

여기 내 SMS 모델 클래스가 있습니다.

package com.example.test1;
public class SmsModel {
    private  String Id;
    private String ContactNumber;
    private String ContactSms;
    private String Time;
    private String Number;
    public SmsModel(String id, String contactNumber, String contactSms, String time, String number) {
        Id= id;
        ContactNumber= contactNumber;
        ContactSms= contactSms;
        Time= time;
        Number= "Number";
    }
    public String getId() {
        return Id;
    }
    public void setId(String id) {
        Id= id;
    }
    public String getContactNumber() {
        return ContactNumber;
    }
    public void setContactNumber(String contactNumber) {
        ContactNumber= contactNumber;
    }
    public String getContactSms() {
        return ContactSms;
    }
    public void setContactSms(String contactSms) {
        ContactSms= contactSms;
    }
    public String getTime() {
        return Time;
    }
    public void setTime(String time) {
        Time= time;
    }
    public void setNumber(String number) {
        Number= number;
    }
    public String getNumber() {
        return Number;
    }
    @Override
    public String toString() {
        return "SmsModel{" +
                "Id='" + Id + '\'' +
                ", ContactNumber='" + ContactNumber + '\'' +
                ", ContactSms='" + ContactSms + '\'' +
                ", Time='" + Time + '\'' +
                ", Number='" + Number + '\'' +
                '}';
    }
}

할 수 있는 모든 것을 시도했지만 작동하지 않습니다...친절한 도움

메시지가 도착할 때 수신하는 것과 그 후에 메시지를 읽는 것은 두 가지입니다. 여기에서 질문에 대해 한 번에 하나씩 집중해야 합니다. 일반적인 조언의 방식으로 사용된 각 개별 SMS 권한은 런타임에 요청해야 합니다. 현재 READ_SMS만 요청하고 있습니다. 또한 앱이 충돌하는 경우 아래에서 언급한 것처럼 문제가 발생하는 시기와 방법에 대한 설명, 충돌로부터의 전체 스택 추적과 함께 이를 질문에 명시해야 합니다.

Mike M.2021-12-05 03:03:11
  • 이전 Avada 테마를 사용하여 WordPress에서 URL 매개변수 추출 및 에코
  • 다음 android : 데이터 클래스에 값이 저장되지 않았습니다.