Статус sms-сообщения

208
01 августа 2017, 16:00

Никак не получается запросить статусы смс-сообщений - приложение вылетает.

Объясните неофиту в чем может быть причина.

public class MainActivity extends AppCompatActivity {
    //объекты
    private EditText editText_for_sms;
    private Button button;
    String SENT_SMS="SMS_SENT";
    String DELIVERED_SMS="SMS_DELIVERED";
    Intent sent_intent = new Intent(SENT_SMS);
    Intent deliver_intent = new Intent(DELIVERED_SMS);
    PendingIntent sentPI;
    PendingIntent deliveredPI;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PendingIntent sentPI = PendingIntent.getBroadcast(MainActivity.this,0,
                sent_intent,0);
        PendingIntent deliveredPI = PendingIntent.getBroadcast(MainActivity.this,0,
                deliver_intent,0);
        Button button = (Button)findViewById(R.id.button);
        Button button2 = (Button)findViewById(R.id.button2);
        EditText editText_for_sms = (EditText)findViewById(R.id.editText_for_sms);       
    }

    //Обработчик кнопок
      public void onClickButton(View view) {                      
            //Переключатель между кнопками:
            switch (view.getId()) {
                case R.id.button:
                    //MyTask myTask = new MyTask();
                    //myTask.execute();
                    //блок с нажатием
                    //для вывода на экран
                    MyTask myTask = new MyTask();
                    String my_http = null;
                    try {
                        myTask.execute();
                        my_http = myTask.get();
                        String[] ttt = my_http.split("<message");
                        String[][] broken_input_m = new String[ttt.length][4];
                        int i;
                        String[] tmp_arr_1_m;
                        for (i = 1; i < ttt.length; i++){
                            String[] tmp_arr_m = ttt[i].split(">");
                            tmp_arr_1_m = tmp_arr_m[0].split("\"");
                            String[] tmp_arr_2_m = tmp_arr_m[1].split("<");
                            broken_input_m[i-1][0]=tmp_arr_1_m[1];
                            broken_input_m[i-1][1]=tmp_arr_1_m[3];
                            broken_input_m[i-1][2]=tmp_arr_1_m[5];
                            broken_input_m[i-1][3]=tmp_arr_2_m[0];
                        }
                        /*for(i = 0; i < broken_input_m.length; i++){*/
                        SmsManager.getDefault().sendTextMessage(broken_input_m[i][0], null, broken_input_m[i][3],
                                sentPI, deliveredPI);
                            /*if (i == 2)
                                break;*/

                        EditText editText_for_sms = (EditText) findViewById(R.id.editText_for_sms);
                        editText_for_sms.setText(my_http);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    }
                    break;
                case R.id.button2:
                    Intent intent = new Intent(this, vivod_na_ekran.class);
                    startActivity(intent);
                    break;
                default:
                    break;
            }
        }

    //Данный метод нужен для запуска различных объектов
    //например, широковещательных приемников или
    //для инициализации компонентов
    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(sentReceiver, new IntentFilter(SENT_SMS));
        registerReceiver(deliverReceiver, new IntentFilter(DELIVERED_SMS));
    }

    //Данный метод служит для остановки
    //BroadcastReceiver'ов - широковещательных сообщений
    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(sentReceiver);
        unregisterReceiver(deliverReceiver);
    }

    //Обработка отправления смс:
    //выводим оповещение с информацией об отправки
    //сообщения
    BroadcastReceiver sentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode()){
                case Activity.RESULT_OK:
                    Toast.makeText(context, "Сообщение выслано", Toast.LENGTH_LONG).show();
                    break;
                default:
                    Toast.makeText(context, "Cообщение не выслано", Toast.LENGTH_LONG).show();
                    break;
            }
        }
    };

    //Обработка доставки смс:
    //выводим оповещение с информацией о доставки
    //сообщения
    BroadcastReceiver deliverReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode()){
                case Activity.RESULT_OK:
                    Toast.makeText(context, "Сообщение отправлено", Toast.LENGTH_LONG).show();
                    break;
                default:
                    Toast.makeText(context, "Сообщение не отправлено", Toast.LENGTH_LONG).show();
                    break;
            }
        }
    };

    //Создаем MyTask для http запрос
    private class MyTask extends AsyncTask<Void, Void, String> {
        private String http_request;
        //метод с запросом к http странице
        @Override
        protected String doInBackground(Void... params) {
            try {
                DefaultHttpClient hc = new DefaultHttpClient();
                ResponseHandler response = new BasicResponseHandler();
                HttpGet http = new HttpGet("тут находится пхп с данными");
                http_request = (String) hc.execute(http, response);               
            } catch (Exception e) {
                e.printStackTrace();
            }
            return http_request;
        }
        //место для метода onPostExecute
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            result = http_request;           
        }
    }
Answer 1

Судя по стек-трейсу:

ArrayIndexOutOfBoundsException: length=3; index=3

Вы выходите за пределы массива в строке:

SmsManager.getDefault().sendTextMessage(broken_input_m[i][0]‌​, null, broken_input_m[i][3],sentPI, deliveredPI);

UPD. Далее, судя по строке:

java.lang.SecurityException: Sending SMS message: uid 10060 does not have android.permission.SEND_SMS.

у Вас либо нет разрешения:

<uses-permission android:name="android.permission.SEND_SMS"/>

в AndroidManifest.xml, либо Вы его не запрашиваете в рантайме (а запрашивать нужно, так как это разрешение относится к категории dangerous).

Пример с runtime permissions из официальной документации:

Запрос:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {
        // 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.
    } else {
        // No explanation needed, we can request the permission.
        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);
        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Обработка ответа от пользователя:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted, yay! Do the
                // contacts-related task you need to do.
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }
        // other 'case' lines to check for other
        // permissions this app might request
    }
}
READ ALSO
Ошибка Could not find or load main class

Ошибка Could not find or load main class

Вроде все работало, я вышел из IDE, потом опять зашел, и при запуске выходит ошибка

435
Вызов метода по событию , регистрация на событие

Вызов метода по событию , регистрация на событие

Как на java реализовать что бы по определённому событию вызывались определённые методы, которые подписаны на это событиеТо есть если нажали...

205
Как исключить дубликаты из HQL запроса?

Как исключить дубликаты из HQL запроса?

Есть метод который из таблицы с предложениями о продаже машин выбирает все марки включая дубликатыКак избавится от дубликатов а уровне запроса?

223
Origin null в cors фильтре JavaEE

Origin null в cors фильтре JavaEE

Подскажите пожалуйстаЕсть CORS фильтр:

245