Отправка нескольких сообщений не работает должным образом в Android
У меня есть приложение для Android, которое отправляет несколько сообщений и звонит по событию клика. Проблема в том, что
У меня два события щелчка. При втором событии щелчка код работает отлично, но при первом событии щелчка тот же код не работает (то есть он не отправляет никакого сообщения). Это может показаться очень глупым, но я не могу обнаружить ошибку. Пожалуйста, скажите мне, как решить эту проблему.
Если нужна какая-либо другая информация, пожалуйста, сообщите мне.
Мой код:
public class MainActivity extends AppCompatActivity {
ArrayList<String> ar = new ArrayList<String>();
public static final String MyPREFERENCES1 = "MyPrefs1" ;
public static final String C11 = "contact11";
public static final String C12 = "contact12";
public static final String C13 = "contact13";
public static final String C14 = "contact14";
public static final String MSG11 = "msg11";
public static final String MyPREFERENCES2 = "MyPrefs2" ;
public static final String C21 = "contact21";
public static final String C22 = "contact22";
public static final String C23 = "contact23";
public static final String C24 = "contact24";
public static final String MSG22 = "msg22";
RelativeLayout b1,b2,b3,b4,b5;
Uri smsToUri;
// String c11,c12,c13,c14,msg11;
String c21,c22,c23,c24,msg22;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1 = (RelativeLayout) findViewById(R.id.LinearLayout1);
b2 = (RelativeLayout) findViewById(R.id.LinearLayout2);
SharedPreferences prfs = getSharedPreferences(MyPREFERENCES1, Context.MODE_APPEND);
c11 = prfs.getString(C11, "");
c12 = prfs.getString(C12, "");
c13 = prfs.getString(C13, "");
c14 = prfs.getString(C14, "");
msg11 = prfs.getString(MSG11, "");
First click event
assert b1 != null;
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File f = new File(
"/data/data/com.example.neo.dial_test/shared_prefs/MyPrefs1.xml");
if (f.exists()) {
if (c11.toString().equals(C11)||c11.toString().equals("")||c12.toString().equals(C11)||c12.toString().equals("")||c13.toString().equals(C11)||c13.toString().equals("")||c14.toString().equals(C11)||c14.toString().equals("")){
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
return;
}
Intent intent3 = new Intent(Intent.ACTION_CALL);
intent3.setData(Uri.parse("tel:11223321"));
intent3.putExtra("com.android.phone.extra.slot", 0);
startActivity(intent3);
Log.d("TAG", "SharedPreferences Name_of_your_preference : exist");
for (int i = 0; i < ar.size(); i++)
{
String message = msg11.toString();
String tempMobileNumber = ar.get(i).toString();
multipleSMS(tempMobileNumber, message);
}
}
else {
Intent intent3 = new Intent(Intent.ACTION_CALL);
intent3.setData(Uri.parse("tel:9506171242"));
intent3.putExtra("com.android.phone.extra.slot", 0);
startActivity(intent3);
Log.d("TAG", "SharedPreferences Name_of_your_preference : exist");
for (int i = 0; i < ar.size(); i++)
{
String message = msg11.toString();
String tempMobileNumber = ar.get(i).toString();
multipleSMS(tempMobileNumber, message);
}
}
}
else{
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
return;
}
Intent intent3 = new Intent(Intent.ACTION_CALL);
intent3.setData(Uri.parse("tel:9506171243"));
intent3.putExtra("com.android.phone.extra.slot", 0);
startActivity(intent3);
Log.d("TAG", "SharedPreferences Name_of_your_preference : exist");
}
}
});
SharedPreferences prfs2 = getSharedPreferences(MyPREFERENCES2, Context.MODE_APPEND);
c21 = prfs2.getString(C21, "");
c22 = prfs2.getString(C22, "");
c23 = prfs2.getString(C23, "");
c24 = prfs2.getString(C24, "");
msg22 = prfs2.getString(MSG22, "");
ar.add(c21);
ar.add(c22);
ar.add(c23);
ar.add(c24);
//
Second click event
assert b2 != null;
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File f = new File(
"/data/data/com.example.neo.dial_test/shared_prefs/MyPrefs2.xml");
if (f.exists()) {
if (c21.toString().equals(C11)||c21.toString().equals("")||c22.toString().equals(C11)||c22.toString().equals("")||c23.toString().equals(C11)||c23.toString().equals("")||c24.toString().equals(C11)||c24.toString().equals("")){
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
return;
}
Intent intent3 = new Intent(Intent.ACTION_CALL);
intent3.setData(Uri.parse("tel:9506171244"));
intent3.putExtra("com.android.phone.extra.slot", 0);
startActivity(intent3);
Log.d("TAG", "SharedPreferences Name_of_your_preference : exist");
for (int i = 0; i < ar.size(); i++)
{
String message = msg22.toString();
String tempMobileNumber = ar.get(i).toString();
multipleSMS(tempMobileNumber, message);
}
}
else {
Intent intent3 = new Intent(Intent.ACTION_CALL);
intent3.setData(Uri.parse("tel:9506171244"));
intent3.putExtra("com.android.phone.extra.slot", 0);
startActivity(intent3);
Log.d("TAG", "SharedPreferences Name_of_your_preference : exist");
for (int i = 0; i < ar.size(); i++)
{
String message = msg22.toString();
String tempMobileNumber = ar.get(i).toString();
multipleSMS(tempMobileNumber, message);
}
}
}
else{
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
return;
}
Intent intent3 = new Intent(Intent.ACTION_CALL);
intent3.setData(Uri.parse("tel:9506171244"));
intent3.putExtra("com.android.phone.extra.slot", 0);
startActivity(intent3);
Log.d("TAG", "SharedPreferences Name_of_your_preference : exist");
}
} } );
}
private void multipleSMS(String phoneNumber, String message) {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
// ---when the SMS has been sent---
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
ContentValues values = new ContentValues();
for (int i = 0; i < ar.size() - 1; i++) {
values.put("address", ar.get(i).toString());
// txtPhoneNo.getText().toString());
values.put("body", ar.toString());
}
getContentResolver().insert(
Uri.parse("content://sms/sent"), values);
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
// ---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
try{
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}catch (IllegalArgumentException ex){
Toast.makeText(getBaseContext(), "exception",
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onBackPressed() {
// mIsBackButtonPressed = true;
// super.onBackPressed();
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Exit Application?");
alertDialogBuilder
.setMessage("Click yes to exit!")
.setCancelable(true)
.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Write your code here to execute after dialog
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startMain.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(startMain);
finish();
MainActivity.isQuit = true;
// Toast.makeText(getApplicationContext(), "ThanK You",
// Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
return;
}
public static boolean isQuit = false;
}
журнал ошибок при втором нажатии кнопки
E/ActivityThread: Activity com.example.neo.dial_test.MainActivity has leaked IntentReceiver com.example.neo.dial_test.MainActivity$7@798546 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity com.example.neo.dial_test.MainActivity has leaked IntentReceiver com.example.neo.dial_test.MainActivity$7@798546 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:898)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:699)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1653)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1633)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1627)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:488)
at com.example.neo.dial_test.MainActivity.multipleSMS(MainActivity.java:595)
at com.example.neo.dial_test.MainActivity.access$000(MainActivity.java:32)
at com.example.neo.dial_test.MainActivity$1.onClick(MainActivity.java:139)
at android.view.View.performClick(View.java:4757)
at android.view.View$PerformClick.run(View.java:19757)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5233)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
и когда я использую этот код для обработки вышеуказанной ошибки (Вы пропускаете вызов unregisterReceiver()?), используя этот код:
private BroadcastReceiver sendBroadcastReceiver;
private BroadcastReceiver deliveryBroadcastReceiver;
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
sendBroadcastReceiver = new BroadcastReceiver()
{
public void onReceive(Context arg0, Intent arg1)
{
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS Sent", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off", Toast.LENGTH_SHORT).show();
break;
}
}
};
deliveryBroadcastReceiver = new BroadcastReceiver()
{
public void onReceive(Context arg0, Intent arg1)
{
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS Delivered", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered", Toast.LENGTH_SHORT).show();
break;
}
}
};
registerReceiver(deliveryBroadcastReceiver, new IntentFilter(DELIVERED));
registerReceiver(sendBroadcastReceiver , new IntentFilter(SENT));
public void sendSMS(String phoneNumber, String message)
{
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
@Override
protected void onStop()
{
unregisterReceiver(sendBroadcastReceiver);
unregisterReceiver(deliveryBroadcastReceiver);
super.onStop();
}
}
Журнал ошибок После изменения кода замените функцию multicSMS на функцию sendSMS нового кода.
FATAL EXCEPTION: main
Process: com.example.neo.dial_test, PID: 20531
java.lang.IllegalArgumentException: Invalid destinationAddress
at android.telephony.SmsManager.sendTextMessage(SmsManager.java:243)
at com.example.neo.dial_test.MainActivity.sendSMS(MainActivity.java:611)
at com.example.neo.dial_test.MainActivity$3.onClick(MainActivity.java:185)
at android.view.View.performClick(View.java:4757)
at android.view.View$PerformClick.run(View.java:19757)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5233)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)