【问题标题】:android programming : calling a phone number and returning to app right after being rejectedandroid编程:拨打电话号码并在被拒绝后立即返回应用程序
【发布时间】:2017-08-02 06:48:50
【问题描述】:

我想使用 eclipse 编写一个 android 应用程序,从用户那里获取电话号码,并在拨打电话号码(使用意图或其他方式)后返回应用程序并根据响应调用不同的方法(拒绝、错过、 ...)

我知道如何使用意图拨打号码,但不知道如何处理此解决方案(在被拒绝或错过后立即返回应用)

【问题讨论】:

标签: android android-intent phone-call


【解决方案1】:
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneCall {

    public static final String PARAM_CALL_DONE = "CALL_DONE";

    public static void call(String phoneNumber, Activity activity) {
        CallEndedListener.createListenerFor(activity);
        Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber));
        activity.startActivity(callIntent);
    }

    private static class CallEndedListener extends PhoneStateListener {
        private boolean called = false;
        private final TelephonyManager telephonyManager;
        private final Context context;
        private Activity activity;

        private CallEndedListener(Activity act) {
            this.context = act.getBaseContext();
            this.activity = act;
            this.telephonyManager = (TelephonyManager) context
                    .getSystemService(Activity.TELEPHONY_SERVICE);
        }

        public static void createListenerFor(Activity act) {
            CallEndedListener listener = new CallEndedListener(act);
            listener.telephonyManager.listen(listener, LISTEN_CALL_STATE);
        }

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            if (called && state == TelephonyManager.CALL_STATE_IDLE) {
                called = false;
                telephonyManager.listen(this, PhoneStateListener.LISTEN_NONE);
                try {
                    Intent t = new Intent(context, activity.getClass());
                    t.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    t.putExtras(activity.getIntent());
                    t.putExtra(PARAM_CALL_DONE, true);
                    t.setAction(Intent.ACTION_MAIN);
                    activity.finish();
                    activity = null;
                    context.startActivity(t);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
                    called = true;
                }
            }
        }
    }
}

通过移交参数“PARAM_CALL_DONE”,调用活动可以测试它是否在调用后启动/恢复。在 onResume() 方法中测试它是有意义的,如下所示:

@Override
protected void onResume() {
    if (extras.getBoolean(PhoneCall.PARAM_CALL_DONE)) {
        showInfoText(); // do whatever you like here...

        extras.remove(PhoneCall.PARAM_CALL_DONE);
    }
}

不要忘记在清单文件中添加权限。

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<uses-permission android:name="android.permission.CALL_PRIVILEGED"></uses-permission>

为了使用电话,一个非常简单的方法调用就足够了,“phonenumber”是一个字符串形式的电话号码,并从一个活动中调用

PhoneCall.call(phonenumber, this);

【讨论】:

  • 谢谢!但是 onResume 中使用的 extras 对象是什么?
  • 如果您想显示任何通话信息,那么您可以在断开通话后在 onResume 中显示。它的可选取决于您的要求。
  • 对不起,我在谈论 extras.getBoolean (...) 我得到错误。 extras 未定义为变量。
  • extras 是您传递的可选 Bundle 值。
猜你喜欢
  • 1970-01-01
  • 2012-03-02
  • 2011-10-29
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多