java - Android - why the app crash when the service receive a call and the app is closed? -
i making app make happen when phone gets call, after lot of searching discover can use broadcastreceiver , service created service called phonestateservice:
import android.app.service; import android.content.broadcastreceiver; import android.content.context; import android.content.intent; import android.content.intentfilter; import android.os.ibinder; import android.telephony.telephonymanager; import android.widget.toast; public class phonestateservice extends service { private static broadcastreceiver broadcastreceiver; @override public ibinder onbind(intent arg0) { return null; } @override public void oncreate() { registerbroadcastreceiver(); } @override public void ondestroy() { unregisterreceiver(broadcastreceiver); broadcastreceiver = null; } private void registerbroadcastreceiver() { broadcastreceiver = new broadcastreceiver() { @override public void onreceive(context context, intent intent) { string statestr = intent.getextras().getstring(telephonymanager.extra_state); if(statestr.equals(telephonymanager.extra_state_ringing)){ new phonestatehandler().onincomingcallstarted(context); } } }; intentfilter filter = new intentfilter(telephonymanager.action_phone_state_changed); filter.addaction(intent.action_screen_off); registerreceiver(broadcastreceiver, filter); } } this code starting phonestateservice(inside mainactivity):
if(permissionchecker.checkselfpermission(this, manifest.permission.read_phone_state) == permissionchecker.permission_granted) { startservice(new intent(getapplicationcontext(), phonestateservice.class)); } part manifest file:
<service android:name=".service.phonestateservice" /> when phone gets call , app running (it's still didn't destroy) working after close app , phone gets call app crash , give me message app has stop working.
please tell me problem, didn't find answer.
edit:
the exception:
09-11 10:26:30.598 29461-29461/? e/androidruntime: fatal exception: main process: com.multiplies.multiring, pid: 29461 java.lang.runtimeexception: error receiving broadcast intent { act=android.intent.action.screen_off flg=0x50000010 } in com.multiplies.multiring.service.phonestateservice$1@1924f18 @ android.app.loadedapk$receiverdispatcher$args.run(loadedapk.java:891) @ 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:5417) @ java.lang.reflect.method.invoke(native method) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:726) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:616) caused by: java.lang.nullpointerexception: attempt invoke virtual method 'java.lang.string android.os.bundle.getstring(java.lang.string)' on null object reference @ com.multiplies.multiring.service.phonestateservice$1.onreceive(phonestateservice.java:36) @ android.app.loadedapk$receiverdispatcher$args.run(loadedapk.java:881) @ 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:5417) @ java.lang.reflect.method.invoke(native method) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:726) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:616) edit:
i did people said:
string statestr = intent.getextras() != null ? intent.getextras().getstring(telephonymanager.extra_state) : ""; put doesn't fix problem. thought won't work because if intent.getextras() returning null, if statement won't work because it's returning null , it's want telephonymanager.extra_state_ringing:
if(statestr.equals(telephonymanager.extra_state_ringing)){ new phonestatehandler().onincomingcallstarted(context); } but thank help.
huge edit:
part of manifest:
<service android:name=".phonestate.phonestateservice" /> <receiver android:name=".phonestate.phonestatebroadcast"> <intent-filter> <action android:name="android.intent.action.phone_state" /> </intent-filter> </receiver> phonestatebroadcast:
import android.app.service; import android.content.broadcastreceiver; import android.content.context; import android.content.intent; import android.telephony.telephonymanager; import android.util.log; public class phonestatebroadcast extends broadcastreceiver { context context; public void onreceive(context context, intent intent) { this.context = context; try { telephonymanager telephonymanager = (telephonymanager) context.getsystemservice(service.telephony_service); switch (telephonymanager.getcallstate()) { case telephonymanager.call_state_ringing: context.startservice(new intent(context, phonestateservice.class)); break; } } catch (exception e) { log.e("phone receive error", " " + e); } } } phonestateservice:
import android.app.intentservice; import android.content.intent; public class phonestateservice extends intentservice { public phonestateservice(string name) { super(name); } @override protected void onhandleintent(intent intent) { new phonestatehandler().onincomingcallstarted(getapplicationcontext()); } } after edit still getting crash.
for reason extra's empty. doing intent.getextras().xxx intent.getextras() returns null, calling .xxx on throws error.
changing
string statestr = intent.getextras().getstring(telephonymanager.extra_state); into
string statestr = intent.getextras() != null ? intent.getextras().getstring(telephonymanager.extra_state) : ""; will stop crash happening, might want reason why expect extra's there aren't in intent.
Comments
Post a Comment