簡體   English   中英

美元代碼無法正常工作

[英]Ussd code does not work properly

我在按鈕上有一個ussd代碼。我在清單中添加了CALL_PHONE權限。 我使用了api(23)。 此代碼無法正常工作

基本上我應該做什么? 我有以下錯誤:

E / AndroidRuntime:致命例外:主進程:com.mahdishekari.mycollectbill,PID:31738 java.lang.SecurityException:權限拒絕:啟動Intent {act = android.intent.action.CALL dat = tel:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx cmp = com。來自ProcessRecord {4e2904f 31738:com.mahdishekari.mycollectbill / u0a109}(pid = 31738,uid = 10109)的android.server.telecom / .components.UserCallActivity},具有在android.os.Parcel.readException上的android.permission.CALL_PHONE權限被撤消(android.os.Parcel.readException(Parcel.java:1573)位於android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2776)位於android.app.Instrumentation.execStartActivity(Instrumentation.java: 1509)位於android.app.Activity.startActivityForResult(Activity.java:3958)位於android.app.Activity.startActivityForResult(Activity.java:3919)位於com.mahdishekari.mycollectbill.ActivityMain $ C00661.onClick(ActivityMain.java:78 ),位於android.view.Vie的android.view.View.performClick(View.java:5217) w $ PerformClick.run(View.java:21349)在android.os.Handler.handleCallback(Handler.java:739)在android.os.Handler.dispatchMessage(Handler.java:95)在android.os.Looper.loop (Looper.java:148)在android.app.ActivityThread.main(ActivityThread.java:5585)在java.lang.reflect.Method.invoke(本機方法)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:730),位於com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)I / Process:正在發送信號。 PID:31738 SIG:9與目標VM斷開連接,地址:'localhost:8601',傳輸:'socket'

我的代碼:

public class ActivityMain extends ActivityBase {
Button btnLink;
Button btnPayBill;
Button btnRecords;
Button btnScanner;
Button btnSupport;
boolean doubleBackToExitPressedOnce;
DatabaseHelper2 myDbHelper;
TextView tvBillType;
TextView tvPrice;
EditText txtBillID;
EditText txtPayID;
EditText txtPrice;


class C00661 implements OnClickListener {
    C00661() {
    }

    public void onClick(View v) {
        String payID = ActivityMain.this.txtPayID.getText().toString();
        String billID = ActivityMain.this.txtBillID.getText().toString();
        String myID = "124336";
        String price = ActivityMain.this.txtPrice.getText().toString();
        if (billID.length() == 0) {
            ActivityMain.this.showToast("\u0634\u0646\u0627\u0633\u0647 \u0642\u0628\u0636 \u0648\u0627\u0631\u062f \u0646\u0634\u062f\u0647 \u0627\u0633\u062a");
        } else if (payID.length() == 0) {
            ActivityMain.this.showToast("\u0634\u0646\u0627\u0633\u0647 \u067e\u0631\u062f\u0627\u062e\u062a \u0648\u0627\u0631\u062f \u0646\u0634\u062f\u0647 \u0627\u0633\u062a");
        } else if (price.length() == 0) {
            ActivityMain.this.showToast("\u0645\u0628\u0644\u063a \u0648\u0627\u0631\u062f \u0646\u0634\u062f\u0647 \u0627\u0633\u062a");
        } else {
            int i;
            int payIdLen = payID.length();
            for (i = 0; i < 13 - payIdLen; i++) {
                payID = "0" + payID;
            }
            int billIdLen = billID.length();
            for (i = 0; i < 13 - billIdLen; i++) {
                billID = "0" + billID;
            }
            Bill entityBillRercord = new Bill();
            entityBillRercord.billId = billID;
            entityBillRercord.createDate = Tools.getDate();
            entityBillRercord.payId = payID;
            entityBillRercord.refId = "";
            entityBillRercord.price = Tools.toInt(price);
            DbBills.insert(entityBillRercord);
            String encodeHash = Uri.encode("#");
            String ussd = "*733*3*2*" + billID + "*" + payID + "*" + encodeHash;
            ActivityMain.this.startActivityForResult(new Intent("android.intent.action.CALL", Uri.parse("tel:" + ussd)),1);
        }
    }
}


class Scanner implements OnClickListener {
    Scanner() {
    }

    @Override
    public void onClick(View v) {

        if (v.getId() == R.id.btnReadBarcode) {
            IntentIntegrator scanIntegrator = new IntentIntegrator(ActivityMain.this);
            scanIntegrator.initiateScan();
        }
    }
}


class C00683 implements OnClickListener {
    C00683() {
    }

    public void onClick(View v) {
        Intent intent = new Intent(ActivityMain.this, ActivitySupport.class);
        startActivity(intent);
        overridePendingTransition(R.anim.slide_in, R.anim.slide_out);

    }
}


class C00694 implements OnClickListener {
    C00694() {
    }

    public void onClick(View v) {
        Intent intent = new Intent("android.intent.action.SEND");
        intent.setType("text/plain");
        intent.putExtra("android.intent.extra.SUBJECT", "\u0646\u0631\u0645 \u0627\u0641\u0632\u0627\u0631 \u0647\u0645\u0647 \u0642\u0628\u0636");
        intent.putExtra("android.intent.extra.TEXT", "\u0646\u0631\u0645 \u0627\u0641\u0632\u0627\u0631 \u0647\u0645\u0647 \u0642\u0628\u0636\n\r\u067e\u0631\u062f\u0627\u062e\u062a \u0631\u0627\u062d\u062a \u0648 \u0622\u0633\u0627\u0646 \u06a9\u0644\u06cc\u0647 \u0642\u0628\u0648\u0636 \u0645\u062c\u0647\u0632 \u0628\u0647 \u0628\u0627\u0631\u06a9\u062f \u062e\u0648\u0627\u0646\n\r http://yealame.ir/upload/allbills.apk");
        ActivityMain.this.startActivity(Intent.createChooser(intent, "share"));
    }
}


class C00705 implements OnClickListener {
    C00705() {
    }

    public void onClick(View v) {
        Intent intent = new Intent(ActivityMain.this, ActivityRecords.class);
        startActivity(intent);
        overridePendingTransition(R.anim.slide_in, R.anim.slide_out);

    }
}


class C00716 implements TextWatcher {
    C00716() {
    }

    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    public void afterTextChanged(Editable s) {
        String payID = ActivityMain.this.txtPayID.getText().toString();
        String price = "";
        if (payID.length() != 0) {
            int i;
            int payIdLen = payID.length();
            for (i = 0; i < 13 - payIdLen; i++) {
                payID = "0" + payID;
            }
            for (i = 0; i < 8; i++) {
                price = new StringBuilder(String.valueOf(price)).append(String.valueOf(payID.charAt(i))).toString();
            }
            price = String.valueOf(Tools.toInt(price));
            ActivityMain.this.txtPrice.setText(new StringBuilder(String.valueOf(price)).append("00").toString());
            ActivityMain.this.tvPrice.setText("\u0645\u0628\u0644\u063a \u0642\u0628\u0636: " + price + "00 \u062a\u0648\u0645\u0627\u0646");
        }
    }
}


class C00727 implements TextWatcher {
    C00727() {
    }

    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    public void afterTextChanged(Editable s) {
        String billID = ActivityMain.this.txtBillID.getText().toString();
        int billIdLen = billID.length();
        if (billIdLen != 0) {
            for (int i = 0; i < 13 - billIdLen; i++) {
                billID = "0" + billID;
            }
            ActivityMain.this.setBillIcon(Tools.getBillIcon(billID));
        }
    }
}


class C00738 implements Runnable {
    C00738() {
    }

    public void run() {
        ActivityMain.this.doubleBackToExitPressedOnce = false;
    }
}

public ActivityMain() {
    this.doubleBackToExitPressedOnce = false;
}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(1);
    setContentView(R.layout.main);
    setFont(findViewById(R.id.llMain));
    loadDb();
    this.btnPayBill = (Button) findViewById(R.id.btnPay);
    this.btnScanner = (Button) findViewById(R.id.btnReadBarcode);
    this.txtPayID = (EditText) findViewById(R.id.txtPayID);
    this.txtPrice = (EditText) findViewById(R.id.txtPrice);
    this.txtBillID = (EditText) findViewById(R.id.txtBillID);
    this.tvPrice = (TextView) findViewById(R.id.tvBillPrice);
    this.tvBillType = (TextView) findViewById(R.id.tvBillType);
    this.btnRecords = (Button) findViewById(R.id.btnRecords);
    this.btnLink = (Button) findViewById(R.id.btnLink);
    this.btnSupport = (Button) findViewById(R.id.btnSupport);
    setListeners();
}

private void loadDb() {
    this.myDbHelper = new DatabaseHelper2(this);
    try {
        this.myDbHelper.createDataBase();
    } catch (IOException e) {
    }
    try {
        this.myDbHelper.openDataBase();
    } catch (SQLException e2) {
    }
    BaseDataLayer.db = this.myDbHelper.getDB();
}

private void setListeners() {
    this.btnPayBill.setOnClickListener(new C00661());
    this.btnScanner.setOnClickListener(new Scanner());
    this.btnSupport.setOnClickListener(new C00683());
    this.btnLink.setOnClickListener(new C00694());
    this.btnRecords.setOnClickListener(new C00705());
    this.txtPayID.addTextChangedListener(new C00716());
    this.txtBillID.addTextChangedListener(new C00727());
}

private void setBillIcon(int billType) {
    switch (billType) {
        case CursorAdapter.FLAG_AUTO_REQUERY /*1*/:
            this.tvBillType.setBackgroundResource(R.drawable._bill_1_waterpng);
        case CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER /*2*/:
            this.tvBillType.setBackgroundResource(R.drawable._bill_2_electric);
        case TransportMediator.FLAG_KEY_MEDIA_FAST_FORWARD /*3*/:
            this.tvBillType.setBackgroundResource(R.drawable._bill_3_gas);
        case TransportMediator.FLAG_KEY_MEDIA_PLAY /*4*/:
            this.tvBillType.setBackgroundResource(R.drawable._bill_4_tel);
        default:
            this.tvBillType.setBackgroundDrawable(null);
    }
}

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
    if (scanningResult != null) {
        String scanContent = scanningResult.getContents();
        int contentsLen = scanContent.length();
        for (int i = 0; i < 26 - contentsLen; i++) {
            scanContent = "0" + scanContent;
        }
        if (scanContent != null) {
            String txtBillID = scanContent.substring(0, 13);
            String txtPayID = scanContent.substring(18);
            this.txtBillID.setText(txtBillID);
            this.txtPayID.setText(txtPayID);
            this.btnPayBill.setActivated(true);
        }
    } else {
        Toast toast = Toast.makeText(getApplicationContext(),
                "No scan data received!", Toast.LENGTH_SHORT);
        toast.show();
    }
}


public void onBackPressed() {
    if (this.doubleBackToExitPressedOnce) {
        super.onBackPressed();
        return;
    }
    this.doubleBackToExitPressedOnce = true;
    Toast.makeText(this, "\u0628\u0631\u0627\u06cc \u062e\u0631\u0648\u062c \u062f\u0648\u0628\u0627\u0631\u0647 \u06a9\u0644\u06cc\u062f \u0628\u0627\u0632\u06af\u0634\u062a \u0631\u0627 \u0628\u0632\u0646\u06cc\u062f", Toast.LENGTH_LONG).show();
    new Handler().postDelayed(new ActivityMain.C00738(), 2000);
}

在此處輸入圖片說明

在android> 23中,您必須在運行時檢查權限

在運行時請求權限

清單中,您已經聲明要向用戶請求這些權限。 但是,您必須了解,僅通過在Manifest中聲明它們,您實際上並沒有獲得這些權限。 您需要在運行時請求這些權限。

從Android 6.0(API級別23)開始,用戶可以隨時撤消任何應用程序的權限,即使該應用程序定位於較低的API級別也是如此。 因此,即使該應用昨天使用了相機,也無法假設它今天仍然具有該權限。

資料來源: 官方網站

我還沒有完全通過您的代碼。 但是,關於解決您所發布的錯誤,解決方案非常簡單。 您需要做的就是在運行時請求android.permission.CALL_PHONE

最好的指南可能是官方網站 只需閱讀10分鍾即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM