【问题标题】:How to detect that the call which is done from our android device is answered or rejceted?如何检测从您的 android 设备拨打的电话是否被接听或拒绝?
【发布时间】:2014-04-26 05:54:19
【问题描述】:

我正在申请拨打多个号码。

在那个应用中

  1. 我给 1 个人打电话并且如果用户接听了电话,那么 应该停止循环。

  2. 但是如果呼叫被拒绝,那么呼叫应该在下一个号码上并且 循环应该是 couninue。

我的问题是我无法检测到电话是被拒绝还是被接听。当我在网上搜索时,有些人说无法检测到电话被接听或被拒绝。

真的不能在android中检测到调用如果可以的话我该怎么做呢?

【问题讨论】:

标签: android phone-call


【解决方案1】:

我想你可以在PhoneStateListener class'onCallStateChanged 方法中查看上次通话的呼出时间。如果状态为空闲,即TelephonyManager.CALL_STATE_IDLE,则获取数据。

类似这样的:

Cursor mCallCursor = context.getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI,null,null,null,null);
int duration = mCallCursor.getColumnIndex( CallLog.Calls.DURATION);
while(mCallCursor.moveToFirst())
{   
    Toast.makeText(context, mCallCursor.getString(duration), Toast.LENGTH_LONG).show();
}

您可以找到更多关于 here 的信息。我没有测试上面的代码。但这样的事情应该有效。

您可以检查时间是否为 00:00,然后调用下一个循环数。否则你可以停止呼叫。

希望对你有所帮助。

【讨论】:

  • 是的,这就是我想要的。但是您有任何示例吗?
  • 没有@PoojaRoy。我刚刚有了一个想法。如此分享。您可以这样实现并测试是否有帮助。
  • 恭喜 :) @PoojaRoy .
  • 它对我不起作用,我只是把这个函数放在我的 Phonestate.Offhook 状态中。这是我的问题:- stackoverflow.com/questions/47695613/…
【解决方案2】:

下面是通过无障碍事件检测拨出电话的代码 -

在您的项目中添加一个扩展 AccessibilityService 的类 -

public class CallDetection extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
     acquireLock(this);
    Log.d("myaccess","after lock");
    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
        Log.d("myaccess","in window changed");
        AccessibilityNodeInfo info = event.getSource();
        if (info != null && info.getText() != null) {
            String duration = info.getText().toString();
            String zeroSeconds = String.format("%02d:%02d", new Object[]{Integer.valueOf(0), Integer.valueOf(0)});
            String firstSecond = String.format("%02d:%02d", new Object[]{Integer.valueOf(0), Integer.valueOf(1)});
            Log.d("myaccess","after calculation - "+ zeroSeconds + " --- "+ firstSecond + " --- " + duration);
            if (zeroSeconds.equals(duration) || firstSecond.equals(duration)) {
                Toast.makeText(getApplicationContext(),"Call answered",Toast.LENGTH_SHORT).show();
               // Your Code goes here
            }
            info.recycle();
        }
    }
}


@Override
protected void onServiceConnected() {
    super.onServiceConnected();
    Toast.makeText(this,"Service connected",Toast.LENGTH_SHORT).show();
    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.eventTypes = AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
    info.notificationTimeout = 0;
    info.packageNames = null;
    setServiceInfo(info);
}

@Override
public void onInterrupt() {

}
}

但是要让event.getSource() 函数工作,你必须通过xml 指定一些服务配置,所以在你的项目中创建一个xml 文件夹并添加一个名为serviceconfig 的xml 文件。 xml(你可以给任何你想要的名字。

serviceconfig的内容如下——

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/callDetection"
android:accessibilityEventTypes="typeWindowContentChanged"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
/>

您可以在Here中找到更多关于serviceconfig的信息

现在像这样在 Manifest 文件中添加您的服务 -

<service android:name=".CallDetection"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
        android:label="@string/callDetection">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/serviceconfig" />
</service>

大功告成,只需运行该应用程序并转到手机中的辅助功能设置,您将找到一个名为检测或任何您喜欢的名称)的选项已作为您的服务描述提供),将其打开以授予您应用的访问权限。

现在您会在接听电话时看到祝酒词。

您可以在其中编写任何您想要的代码,也可以在您的活动中调用回调函数

最重要的 - 在接听电话之前不要拨打您的通话窗口(Android 拨号器窗口),否则这将不起作用。

注意 - 由于 android 没有提供任何解决方案来检测呼叫是否被应答,这是我所做的最好的选择,希望它对你有用。

【讨论】:

  • 请添加一个具体示例,说明如何应用您的解决方案来解决此问题的具体情况。您的答案只不过是带有指向另一个问题答案的链接的评论。如果删除了该问题或答案,则此(以及您发布几乎相同答案的其他地方)将变得毫无用处。
  • 以前我将整个代码和示例添加到多个答案中,但是来自 stackoverflow 的一位版主删除了我的答案,说不要添加重复的答案,这就是为什么我在此处添加链接和对一个问题的实际答案只是,建议我该怎么做,我会的。
  • 我相信重复答案只有在完全重复时才被认为是一个问题。由于问题之间存在差异,因此答案应该存在差异,我个人(作为一个低级平民)更愿意看到完整且与上下文相关的答案,而不是(可能会破坏)其他地方相关答案的链接。跨度>
  • 添加了完整答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多