Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当我想访问SMS时,错误为“;尝试对空对象引用调用虚方法;出现_Android_Firebase Realtime Database_Sms - Fatal编程技术网

Android 当我想访问SMS时,错误为“;尝试对空对象引用调用虚方法;出现

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

我尝试检索短信,然后添加到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)

这门课呢

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
    }
});