Android 当我想访问SMS时,错误为“;尝试对空对象引用调用虚方法;出现
我尝试检索短信,然后添加到Firebase实时数据库并更改特定帐户的余额,但当我要更改余额时,会出现此错误: E/AndroidRuntime:致命异常:主 流程:com.example.nouraalqahtani.debrah2,PID:4500 java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.lang.String java.lang.String.trim()” 在sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1838)中 at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) 位于java.lang.Double.parseDouble(Double.java:539) 位于com.example.nouraalqahtani.debrah2.accesssms$3.onDataChange(accesssms.java:304) 位于com.google.firebase.database.core.ValueEventRegistration.firevent(com.google.firebase:firebase数据库@@16.0.6:75) 位于com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase数据库@@16.0.6:63) 位于com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase数据库@@16.0.6:55) 位于android.os.Handler.handleCallback(Handler.java:790) 位于android.os.Handler.dispatchMessage(Handler.java:99) 位于android.os.Looper.loop(Looper.java:164) 位于android.app.ActivityThread.main(ActivityThread.java:6494) 位于java.lang.reflect.Method.invoke(本机方法) 位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 这门课呢Android 当我想访问SMS时,错误为“;尝试对空对象引用调用虚方法;出现,android,firebase-realtime-database,sms,Android,Firebase Realtime Database,Sms,我尝试检索短信,然后添加到Firebase实时数据库并更改特定帐户的余额,但当我要更改余额时,会出现此错误: E/AndroidRuntime:致命异常:主 流程:com.example.nouraalqahtani.debrah2,PID:4500 java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.lang.String java.lang.String.trim()” 在sun.misc.FloatingDecimal.readJavaFo
package com.example.nouraalqahtani.debrah2;
import android.content.ContentResolver;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
public class accesssms extends AppCompatActivity {
private static accesssms inst;
ArrayList<String> smsMessagesList = new ArrayList<String>();
ListView smsListView;
ArrayAdapter arrayAdapter;
DatabaseReference myRef;
String day;
String updatebalance;
String accounting;
String accountnumber;
String smsbody;
int count;
int childrencount;
double balance;
double amount;
int childrencountinflow;
String type;
String bank;
String amountstr;
public static accesssms instance() {
return inst;
}
@Override
public void onStart() {
super.onStart();
inst = this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_accesssms);
myRef=
FirebaseDatabase.getInstance().getReference("user_account").child(" .
(username)").child("bank_accounts");
day = new SimpleDateFormat("yyyy-MM-dd",
Locale.getDefault()).format(new Date());
smsListView = (ListView) findViewById(R.id.SMSList);
arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, smsMessagesList);
smsListView.setAdapter(arrayAdapter);
// Add SMS Read Permision At Runtime
// Todo : If Permission Is Not GRANTED
if(ContextCompat.checkSelfPermission(getBaseContext(),"android.permission.READ_SMS") ==PackageManager.PERMISSION_GRANTED) {
// Todo : If Permission Granted Then Show SMS
refreshSmsInbox();
} else {
// Todo : Then Set Permission
final int REQUEST_CODE_ASK_PERMISSIONS = 123;
ActivityCompat.requestPermissions(accesssms.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;
arrayAdapter.clear();
do {
String str = "SMS From: " + smsInboxCursor.getString(indexAddress) +
"\n" + smsInboxCursor.getString(indexBody) + "\n";
arrayAdapter.add(str);
//if it samba bank
if (smsInboxCursor.getString(indexAddress).equals(".Samba")) {
smsbody = smsInboxCursor.getString(indexBody);
int ende = smsbody.indexOf(' ');
final String transaction = smsbody.substring(0, ende);
//to check if it outflow or inflow
//if it outflow
if (transaction.equals("دفع")) {
type = "outflow";
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//Take last three number card number
int accountnumberstart = smsbody.lastIndexOf(".");
count = accountnumberstart +5;
accountnumber = smsbody.substring(accountnumberstart+2 , count);
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String dataaccountOUT = ds.child("account_no").getValue(String.class);
if (Integer.parseInt(accountnumber)==Integer.parseInt(dataaccountOUT)) {
childrencount=(int)ds.child("outflow").getChildrenCount();
bank=ds.getKey();
addoutflow();
} } }
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}}); }
else if (transaction.equals("تم")) {
type = "inflow";
//take account number
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//Take the last four numbers of account number
int accountnumberstart = smsbody.indexOf("حساب");
count = accountnumberstart+15 ;
accountnumber = smsbody.substring(accountnumberstart +11, count);
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String dataaccount = ds.child("fourfirstdigit").getValue(String.class);
if (Integer.parseInt(accountnumber)==Integer.parseInt(dataaccount)){
childrencountinflow=(int)ds.child("inflow").getChildrenCount();
bank=ds.getKey();
addinflow();
}
}}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}} while (smsInboxCursor.moveToNext());
blanacechange();
}
public void updateList(final String smsMessage) {
arrayAdapter.insert(smsMessage, 0);
arrayAdapter.notifyDataSetChanged();
}
public void toastMessage(String message){
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}
public void addoutflow(){
// counter=counter+1;
// String co=Integer.toString(counter);
int accounttotalstart = smsbody.lastIndexOf("بقيمة");
int accounttotalend = smsbody.lastIndexOf("ريال");
accounting = smsbody.substring(accounttotalstart + 6, accounttotalend);
amountstr=arabicToenglish(accounting);
myRef.child(bank).child("outflow").child("6").child("amount").setValue(amountstr);
//change the balance
//take vendor name
int vendorstart = smsbody.lastIndexOf("*", count + 1);
int vendorend = smsbody.lastIndexOf(",");
String vendor = smsbody.substring(vendorstart + 3, vendorend);
//add vendor name to database
myRef.child(bank).child("outflow").child("6").child("vendor").setValue(vendor);
//add current time
int timstart = smsbody.lastIndexOf(",");
int timend = smsbody.lastIndexOf("/");
String date = smsbody.substring(timstart + 1, timend + 4);
myRef.child(bank).child("outflow").child("6").child("date").setValue(arabicToenglish(date));
int ti = smsbody.lastIndexOf(" ");
String time = smsbody.substring(timend + 4, ti);
// myRef.child(bank).child("outflow").child("6").child("time").setValue(arabicToenglish(time));
//to check if it AM OR PM
String AMorPM = smsbody.substring(ti + 1);
if (AMorPM.equals("صباحاً")) {
myRef.child(bank).child("outflow").child("6").child("time").setValue(arabicToenglish(time) + " AM");
} else
myRef.child(bank).child("outflow").child("6").child("time").setValue(arabicToenglish(time) + " PM");
}
public void addinflow(){
int accounttotalstart = smsbody.lastIndexOf("مبلغ");
int accounttotalend = smsbody.indexOf(" ");
accounting = smsbody.substring(accounttotalstart + 4, accounttotalend);
amountstr=arabicToenglish(accounting);
myRef.child(bank).child("inflow").child("2").child("amount")
.setValue(amountstr);
//change the balance
int timstart = smsbody.lastIndexOf("في");
int timend = smsbody.lastIndexOf("-");
String date = smsbody.substring(timstart + 2, timend + 5);
myRef.child(bank).child("inflow").child("2").child("date").setValue(arabicToenglish(date));
int ti = smsbody.lastIndexOf(" ");
String time = smsbody.substring(timend + 4, ti);
myRef.child(bank).child("inflow").child("2").child("time").setValue(arabicToenglish(time));
//to check if it AM OR PM
String AMorPM = smsbody.substring(ti + 1);
if (AMorPM.equals("صباحاً")) {
myRef.child(bank).child("inflow").child("2").child("time").setValue(time + " AM");
} else
myRef.child(bank).child("inflow").child("2").child("time").setValue(time + " PM");
}
private static String arabicToenglish(String number)
{
char[] chars = new char[number.length()];
for(int i=0;i<number.length();i++) {
char ch = number.charAt(i);
if (ch >= 0x0660 && ch <= 0x0669)
ch -= 0x0660 - '0';
else if (ch >= 0x06f0 && ch <= 0x06F9)
ch -= 0x06f0 - '0';
chars[i] = ch;
}
return new String(chars);
}
public void blanacechange() {
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String databa = dataSnapshot.child(bank).child("balance").getValue(String.class);
String am = dataSnapshot.child(bank).child("6").child("amount").getValue(String.class);
balance=Double.parseDouble(databa);
amount=Double.parseDouble(am);
if (type.equals("outflow")){
balance = balance - amount;
myRef.child(bank).child("balance").setValue(Double.toString(balance));}
if (type.equals("inflow")){
balance=balance+amount;
myRef.child(bank).child("balance").setValue(Double.toString(balance));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
package com.example.nouraalqahtani.debrah2;
导入android.content.ContentResolver;
导入android.content.pm.PackageManager;
导入android.database.Cursor;
导入android.net.Uri;
导入android.os.Bundle;
导入android.support.annotation.NonNull;
导入android.support.v4.app.ActivityCompat;
导入android.support.v4.content.ContextCompat;
导入android.support.v7.app.AppActivity;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.Toast;
导入com.google.firebase.database.DataSnapshot;
导入com.google.firebase.database.DatabaseError;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入com.google.firebase.database.ValueEventListener;
导入java.text.simpleDataFormat;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.Locale;
公共类访问SMS扩展了AppCompatActivity{
专用静态存取装置;
ArrayList SMMessageList=新建ArrayList();
列表视图smsListView;
ArrayAdapter ArrayAdapter;
数据库参考myRef;
弦日;
字符串更新平衡;
字符串会计;
字符串accountnumber;
串体;
整数计数;
国际儿童计数;
双平衡;
双倍金额;
国际儿童基金会;
字符串类型;
字符串库;
字符串amountstr;
公共静态accesssms实例(){
返回仪表;
}
@凌驾
public void onStart(){
super.onStart();
inst=这个;
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u accesssms);
myRef=
FirebaseDatabase.getInstance().getReference(“用户帐户”).child(“。
(用户名)“).child(“银行账户”);
日期=新的简化格式(“yyyy-MM-dd”,
Locale.getDefault()).format(新日期());
smsListView=(ListView)findViewById(R.id.SMSList);
arrayAdapter=新的arrayAdapter(此,
android.R.layout.simple_list_item_1,smsMessagesList);
设置适配器(arrayAdapter);
//在运行时添加SMS读取权限
//Todo:如果未授予权限
if(ContextCompat.checkSelfPermission(getBaseContext(),“android.permission.READ\u SMS”)==PackageManager.permission\u provided){
//Todo:如果已授予权限,则显示SMS
refreshSmsInbox();
}否则{
//Todo:然后设置权限
最终整数请求\代码\请求\权限=123;
ActivityCompat.requestPermissions(accesssms.this,新字符串[]
{“android.permission.READ\u SMS”},请求\u代码\u请求\u权限);
}
}
公共无效刷新SMSINBOX(){
ContentResolver ContentResolver=getContentResolver();
游标smsInboxCursor=contentResolver.query(Uri.parse(“content://sms/inbox)、空、空、空、空);
int indexBody=smsInboxCursor.getColumnIndex(“body”);
int indexAddress=smsInboxCursor.getColumnIndex(“地址”);
if(indexBody<0 | | |!smsInboxCursor.moveToFirst())返回;
arrayAdapter.clear();
做{
String str=“SMS From:”+smsInboxCursor.getString(indexAddress)+
“\n”+SMSINBOCURSOR.getString(indexBody)+”\n”;
arrayAdapter.add(str);
//如果是桑巴银行
if(smsInboxCursor.getString(indexAddress).equals(“.Samba”)){
smsbody=smsInboxCursor.getString(indexBody);
int ende=smsbody.indexOf(“”);
最终字符串事务=smsbody.substring(0,ende);
//检查是否有流出或流入
//如果它流出
if(交易等价物(“交易等价物”)){
type=“流出”;
myRef.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
//拿最后三个号码卡号码
int accountnumberstart=smsbody.lastIndexOf(“.”);
计数=accountnumberstart+5;
帐号
String databa = dataSnapshot.child(bank).child("balance").getValue(String.class);
String am = dataSnapshot.child(bank).child("6").child("amount").getValue(String.class);
balance=Double.parseDouble(databa);
amount=Double.parseDouble(am);
myRef= FirebaseDatabase.getInstance().getReference("user_account").child(" .
(username)").child("bank_accounts");
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot accountSnapshot: dataSnapshot.getChildren()) {
String databa = accountSnapshot.child("balance").getValue(String.class);
String am = accountSnapshot.child("amount").getValue(String.class);
balance=Double.parseDouble(databa);
amount=Double.parseDouble(am);
...
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
});