나는 현재 SMS 응용 프로그램을 개발하려고 시도하고 있으며 실행되고 메시지를 검색 할 수 있지만 응용 프로그램을 닫고 다시 시작하면 강제로 닫히고 NullPointerException이 있다고 말합니다. 다음은 오류 로그입니다. 목록이 이유 일 수 있지만 이유를 모르겠습니다. StackOverflow는 추가 정보를 추가하지 않고 게시 할 수 없습니다.
08-08 16:08:17.317 9977-9977/backdev.messages E/AndroidRuntime: FATAL EXCEPTION: main
Process: backdev.messages, PID: 9977
java.lang.RuntimeException: Unable to start activity ComponentInfo{backdev.messages/backdev.messages.MessageActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
at android.app.ActivityThread.access$900(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5451)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
at backdev.messages.MessageActivity.refreshSMSInbox(MessageActivity.java:136)
at backdev.messages.MessageActivity.getPermissionToReadSMS(MessageActivity.java:118)
at backdev.messages.MessageActivity.onCreate(MessageActivity.java:78)
at android.app.Activity.performCreate(Activity.java:6323)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
at android.app.ActivityThread.access$900(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5451)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
내 코드는 다음과 같습니다.
private static final int READ_SMS_PERMISSIONS_REQUEST =1;
private Context mContext = MessageActivity.this;
private static final String TAG = "MessageActivity";
private List<PreviewMessage> mPreviewMessages;
private RecyclerView rvMessages;
private static MessageActivity inst;
private RecyclerView.Adapter mMessagesAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
rvMessages = (RecyclerView) findViewById(R.id.rvMessages);
rvMessages.setHasFixedSize(true);
rvMessages.setLayoutManager(new LinearLayoutManager(mContext));
getPermissionToReadSMS();
mPreviewMessages = new ArrayList<>();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS)
!= PackageManager.PERMISSION_GRANTED) {
getPermissionToReadSMS();
} else {
refreshSMSInbox();
}
}
public void getPermissionToReadSMS(){
Log.d(TAG, "getPermissionToReadSMS: getting permission");
if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_SMS)!= PackageManager.PERMISSION_GRANTED){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// Should we show an explanation?
if (shouldShowRequestPermissionRationale(Manifest.permission.READ_SMS)){
Log.d(TAG, "getPermissionToReadSMS: requesting Permission again");
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
Toast.makeText(mContext,"Application will not work without this permission", Toast.LENGTH_SHORT).show();
requestPermissions(new String[]{Manifest.permission.READ_SMS},READ_SMS_PERMISSIONS_REQUEST);
}
// No explanation needed, we can request the permission.
//display explanation first --- not yet done
Log.d(TAG, "getPermissionToReadSMS: requestPermission");
requestPermissions(new String[]{Manifest.permission.READ_SMS},READ_SMS_PERMISSIONS_REQUEST);
}
}else{
refreshSMSInbox();
}
}
private 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");
while (smsInboxCursor.moveToNext()) {
PreviewMessage previewMessage = new PreviewMessage(smsInboxCursor.getString(indexAddress),smsInboxCursor.getString(indexBody), 1);
/*
ERROR HERE
*/
mPreviewMessages.add(previewMessage);
}
mMessagesAdapter = new MessagesAdapter(mPreviewMessages,mContext);
rvMessages.setAdapter(mMessagesAdapter);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
//granted do things here
//read sms
refreshSMSInbox();
}else {
}
}
}
데이터를 추가하기 전에 목록을 초기화하십시오. 때문에 getPermissionToReadSMS();
통화 refreshSMSInbox (); '시도를 초기화하기 전에 목록에 데이터를 추가 할 OS는 마시 멜로보다 낮은 경우
mPreviewMessages = new ArrayList<>();
getPermissionToReadSMS();
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다