Ussd код не работает должным образом

У меня есть код ussd для кнопки. Я добавляю разрешения CALL_PHONE в манифест. Я использую API (23). Этот код не работает должным образом

В основном, что я должен делать? Спасибо. У меня следующая ошибка:

? E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.mahdishekari.mycollectbill, PID: 31738 java.lang.SecurityException: Отказ в разрешении: начало намерения { act=android.intent.action.CALL dat=tel:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx android.server.telecom/.components.UserCallActivity } из ProcessRecord{4e2904f 31738:com.mahdishekari.mycollectbill/u0a109} (pid=31738, uid=10109) с отмененным разрешением android.permission.CALL_PHONE в android.osParception(Parcel.java:1620) в 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.View.performClick(View.java:5217) на android.view.View$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/ Процесс: отправка сигнала. PID: 31738 SIG: 9 Отключен от целевой виртуальной машины, адрес: "localhost:8601", транспорт: "сокет"

Мой код:

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

2 ответа

В манифесте вы заявили, что будете запрашивать эти разрешения у пользователя. Но вы должны понимать, что вы на самом деле не получили эти разрешения, просто объявив их в Манифесте. Вам необходимо запросить эти разрешения во время выполнения.

Начиная с Android 6.0 (уровень API 23), пользователи могут отозвать разрешения у любого приложения в любое время, даже если приложение предназначено для более низкого уровня API. Таким образом, даже если приложение вчера использовало камеру, оно не может предположить, что оно все еще имеет такое разрешение сегодня.

Источник: официальный сайт

Я не полностью просмотрел ваш код. Однако, что касается устранения ошибки, которую вы опубликовали, решение довольно простое. Все, что вам нужно сделать, это попросить android.permission.CALL_PHONE во время выполнения.

Лучшим гидом, вероятно, будет официальный сайт. Это всего лишь 10-минутное чтение.

В Android > 23 вы должны проверить разрешение во время выполнения

Запрос разрешений во время выполнения

Другие вопросы по тегам