Никак не получается запросить статусы смс-сообщений - приложение вылетает.
Объясните неофиту в чем может быть причина.
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;
}
}
Судя по стек-трейсу:
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
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Вроде все работало, я вышел из IDE, потом опять зашел, и при запуске выходит ошибка
Как на java реализовать что бы по определённому событию вызывались определённые методы, которые подписаны на это событиеТо есть если нажали...
Есть метод который из таблицы с предложениями о продаже машин выбирает все марки включая дубликатыКак избавится от дубликатов а уровне запроса?