Я создаю приложение, которое отправляет текущее местоположение, при получении определенного сообщения, скажем «Трассировка», используя широковещательный приемник и сервис.Я почти завершил приложение, но столкнулся с двумя проблемами. Первый выпуск Исключение MessageQueue
5-25 11:07:15.346 2459-2493/com.example.prakaash.knowyourlocation W/MessageQueue: Handler (android.location.LocationManager$ListenerTransport$1) {7743340} sending message to a Handler on a dead thread
java.lang.IllegalStateException: Handler (android.location.LocationManager$ListenerTransport$1) {7743340} sending message to a Handler on a dead thread
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:545)
at android.os.Handler.enqueueMessage(Handler.java:662)
at android.os.Handler.sendMessageAtTime(Handler.java:631)
at android.os.Handler.sendMessageDelayed(Handler.java:601)
at android.os.Handler.sendMessage(Handler.java:538)
at android.location.LocationManager$ListenerTransport.onLocationChanged(LocationManager.java:255)
at android.location.ILocationListener$Stub.onTransact(ILocationListener.java:58)
at android.os.Binder.execTransact(Binder.java:697)
Я просто хочу получить одно ответное сообщение с указанием текущего местоположения при получении широковещательного сообщения. Второй выпуск - я не могу отправить номер телефона из MainActivity в Сервис.Я пробовал решение Передача значения в Service , но я получаю фатальное исключение
java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=100, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.example.prakaash.myapplication/com.example.prakaash.myapplication.MainActivity}: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.example.prakaash.myapplication.ServiceClass (has extras) }
at android.app.ActivityThread.deliverResults(ActivityThread.java:4268)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.example.prakaash.myapplication.ServiceClass (has extras) }
at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1464)
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1505)
at android.app.ContextImpl.startService(ContextImpl.java:1477)
at android.content.ContextWrapper.startService(ContextWrapper.java:650)
at com.example.prakaash.myapplication.MainActivity.onRequestPermissionsResult(MainActivity.java:42)
at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7429)
at android.app.Activity.dispatchActivityResult(Activity.java:7280)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4264)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4312)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1644)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
MainActivity
String phone="9940262305";
RecieverClass recieverClass;
IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
runtime_permissions();
recieverClass=new RecieverClass();
intentFilter= new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
}
private boolean runtime_permissions() {
if(Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE, Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.SEND_SMS,Manifest.permission.RECEIVE_SMS},100);
return true;
}
return false;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 100){
if( grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){
Intent service =new Intent(this,ServiceClass.class);
service.putExtra("UserID", phone);
startService(service);
}
else
{
runtime_permissions();
}
}
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(recieverClass,intentFilter);
}
BroadcastReciever
int count=1;
String message;
@Override
public void onReceive(Context context, Intent intent) {
final Bundle bundle = intent.getExtras();
try {
if (bundle != null)
{
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++)
{
SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
String phoneNumber = currentMessage.getDisplayOriginatingAddress();
String senderNum = phoneNumber;
message = currentMessage.getDisplayMessageBody();
}
// end for loop
if(message.contains("Trace"))
{
Toast.makeText(context, "Working", Toast.LENGTH_SHORT).show();
Intent service =new Intent(context,ServiceClass.class);
context.startService(service);
}
else if(message.isEmpty())
{
Toast.makeText(context, "SMS is null", Toast.LENGTH_SHORT).show();
}
} // bundle is null
}
catch (Exception e)
{
Log.e("SmsReceiver", "Exception smsReceiver" +e);
}
}
ServiceClass(Получение информации о текущем местоположении и отправка SMS)
LocationListener listener;
LocationManager locationManager;
int count=1;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@SuppressLint("MissingPermission")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
final String number = intent.getStringExtra("UserID");
listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
String locat=String.valueOf(location.getLatitude() + "," + location.getLongitude());
if(count==1 )
{
SmsManager sms = SmsManager.getDefault();
if(number !=null)
{
sms.sendTextMessage(number, null, "Know where they are " + "https://www.google.com/maps/?q=" + locat, null, null);
count++;
}
else
{
Toast.makeText(ServiceClass.this, "number is null "+count, Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
};
locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
//noinspection MissingPermission
locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,listener,null);
return Service.START_STICKY;
}