Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 隐藏默认来电屏幕并非始终有效_Android_Broadcastreceiver - Fatal编程技术网

Android 隐藏默认来电屏幕并非始终有效

Android 隐藏默认来电屏幕并非始终有效,android,broadcastreceiver,Android,Broadcastreceiver,我正在开发一个接收来电并自动接听的应用程序。我有一个在工作线程自动应答调用时运行的活动。我想要完成的是抑制默认的来电屏幕,并在运行时将我的活动保持在前台 在这里做了一些研究之后,我认为这可以通过使用BroadcastReceiver并调用BroadcastReceiver.abortBroadcast来实现,同时将android.intent.action.PHONE_STATE broadcast设置为清单中的最高优先级 不幸的是,这只在50%的时间内有效。有一半的时间我能够接听电话,我的活动

我正在开发一个接收来电并自动接听的应用程序。我有一个在工作线程自动应答调用时运行的活动。我想要完成的是抑制默认的来电屏幕,并在运行时将我的活动保持在前台

在这里做了一些研究之后,我认为这可以通过使用BroadcastReceiver并调用BroadcastReceiver.abortBroadcast来实现,同时将android.intent.action.PHONE_STATE broadcast设置为清单中的最高优先级

不幸的是,这只在50%的时间内有效。有一半的时间我能够接听电话,我的活动保持在前台,而有一半的时间,情况并非如此。我怎样才能让它每次都起作用

这是我的舱单:

   <receiver android:enabled="true" android:name=".IncomingCallBroadcastReceiver">
        <intent-filter android:priority="9999">
            <action android:name="android.intent.action.PHONE_STATE"/>
        </intent-filter>
    </receiver>

在Android 4.1.2的类似代码中,我在abortBroadcast调用中遇到一个错误-您使用什么版本进行测试?我使用的是Android 4.0.3。您遇到了什么样的错误?java.lang.RuntimeException:BroadcastReceiver试图在非有序广播期间返回结果-代码中的差异似乎是您处于睡眠状态-可能在您中止广播时广播已完成?如果删除abortBroadcast呼叫,会有什么变化吗?我根据另一个相关SO问题的答案将睡眠放在那里。删除abortBroadcast只允许默认的通话屏幕在我的应用程序%100的上方出现。嗯,我在日志中的4.0.3中得到了相同的错误-不会使应用程序崩溃。你的睡眠可能给了你足够的时间让你的活动回到前台——在来电屏幕的顶部。我希望能完全阻止它的出现,看起来这是不可能的。
public class IncomingCallBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(final Context arg0, Intent arg1) {
    Bundle extras = arg1.getExtras();

    if (extras != null) {
        String state = extras.getString(TelephonyManager.EXTRA_STATE);
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            // set a flag for worker thread to answer call
        }
    }

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    abortBroadcast();
 }
}