Android 发出呼叫的广播接收器未触发
我在服务内以编程方式创建的BroadcastReceiver没有调用onReceive方法。我在服务类内创建了一个扩展BroadcastReceiver的类。早些时候,当我在清单中实现它并运行代码时,它当时不起作用。由于服务在后台连续运行,我认为BroadcastReceiver也会随它去吧 编辑: 现在,在以编程方式声明权限后,我得到一个异常。BroadcastReceiver被触发,但我得到以下异常。请查看下面的代码 代码: 例外情况:Android 发出呼叫的广播接收器未触发,android,broadcastreceiver,Android,Broadcastreceiver,我在服务内以编程方式创建的BroadcastReceiver没有调用onReceive方法。我在服务类内创建了一个扩展BroadcastReceiver的类。早些时候,当我在清单中实现它并运行代码时,它当时不起作用。由于服务在后台连续运行,我认为BroadcastReceiver也会随它去吧 编辑: 现在,在以编程方式声明权限后,我得到一个异常。BroadcastReceiver被触发,但我得到以下异常。请查看下面的代码 代码: 例外情况: 您需要具有“处理\u传出\u呼叫”权限 因为此权限是危
您需要具有“处理\u传出\u呼叫”权限 因为此权限是危险的,所以您需要以编程方式请求它 编辑:
为广播接收器添加默认构造函数。当您在运行时注册时,您不会将其添加到清单。您是否有“处理传出呼叫”权限?我在清单中声明了它是危险的,不足以在清单中声明。需要请求它。我还没有以编程方式声明监听来电的权限。但它正在工作。不是这样dangerous@jobin保护级别:危险我没有以编程方式为READ\u PHONE\u状态声明权限,清单中除外,但我可以检查传入呼叫。@jobin某些权限需要能够在运行时被请求,即以编程方式。。。。想象一下,你的手机摄像头在没有告诉你它正在启动的情况下就启动了。。。所以,试试他说的,自己看看结果
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Environment;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
/**
* Created by Jobin on 15-03-2018.
*/
public class PhoneListenerService extends Service{
private PhoneStateListener phoneStateListener;
private TeleListener teleListener;
private TelephonyManager telephonyManager;
private File file;
private OutgoingReceiver outgoingReceiver;
@Override
public void onCreate()
{
super.onCreate();
outgoingReceiver=new OutgoingReceiver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("android.intent.action.NEW_OUTGOING_CALL");
registerReceiver(outgoingReceiver,intentFilter);
file=new File(Environment.getExternalStorageDirectory().getAbsolutePath());
telephonyManager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
file=new File(Environment.getExternalStorageDirectory(),"AutoCall");
if (!file.exists())
{
Log.e("File","Created");
file.mkdir();
}
else
{
Log.e("File",file.getPath());
}
telephonyManager.listen(new TeleListener(getApplicationContext(),file.getAbsolutePath()),PhoneStateListener.LISTEN_CALL_STATE);
Log.e("Oncreate","Service");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("OnCommand","Service");
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(outgoingReceiver);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public class OutgoingReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("Out","Track");
String phone_number=intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Toast.makeText(context,"Outgoing call identified",Toast.LENGTH_SHORT).show();
}
}
}
FATAL EXCEPTION: main Process: com.js.globemaster.autocallrecorder, PID: 7086
java.lang.RuntimeException: Unable to instantiate receiver com.js.globemaster.autocallrecorder.PhoneListenerService$OutgoingReceiver: java.lang.InstantiationException: java.lang.Class<com.js.globemaster.autocallrecorder.PhoneListenerService$OutgoingReceiver> has no zero argument constructor
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3681)
at android.app.ActivityThread.access$2000(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1903)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.InstantiationException: java.lang.Class<com.js.globemaster.autocallrecorder.PhoneListenerService$OutgoingReceiver> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3676)
at android.app.ActivityThread.access$2000(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1903)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)