Как получить реальное время, когда TelephonyManager.CALL_STATE_OFFHOOK является состоянием из метода onCallStateChanged PhoneStateListener - PullRequest
1 голос
/ 21 апреля 2020

Я делаю код для телефонных звонков. Все успешно, кроме того, что я не могу получить системное время, когда TelephonyManager.CALL_STATE_OFFHOOK состояние от onCallStateChanged(int state, String incomingNumber).

Точно так же я хочу получить системное время, когда приходит состояние TelephonyManager.CALL_STATE_IDLE. Как только я получу оба значения в Mainacctivity, я получу разницу и, основываясь на ее значении, я смогу начать какое-то другое действие.

Например, если разница во времени между состоянием TelephonyManager.CALL_STATE_IDLE и состоянием TelephonyManager.CALL_STATE_IDLE составляет менее 30 секунд, то я могу предположить, что вызов не посещен, и я могу начать другой вызов (или на другой номер ). Я могу сделать все это внутри onCallStateChanged метода класса PhoneStateListener. Но не удалось передать эти значения в Mainactivity ни по переменным, ни по методам и т. Д. c. Это код для вызова, и он работает нормально

Intent myIntentCall = new Intent(Intent.ACTION_CALL, Uri.parse("tel:0123456789"));
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
                    != PackageManager.PERMISSION_GRANTED) {
    requestPermissions();
}
else
{
    startActivity(myIntentCall);            

}

private void requestPermissions () {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
}

Из приведенного ниже фрагмента кода я ожидаю, что обновленное значение _seconds для класса Mainactivity получит доступ к выражению PhoneReceiver._seconds. Но всегда это останется 0. Но я получаю правильное значение для _seconds в классе PhoneReceiver. Код указан ниже

public class PhoneReceiver extends PhoneStateListener {
    Context context;
    static boolean _callStarted = false;
    long _callStartTime;
    long _callEndTime;
    long _callDuration;
    long _minutes;
    static long _seconds;

    public PhoneReceiver(Context context) {
        this.context = context;
    }

   @Override
   public void onCallStateChanged(int state,  String incomingNumber) {
       if ((state == TelephonyManager.CALL_STATE_OFFHOOK) && !_callStarted) {
           _callStarted = !_callStarted;
           _callStartTime = new Date().getTime();
           Toast.makeText(context, "Stage 1: " + "Off Hook -> Boolean: "+_callStarted, Toast.LENGTH_LONG).show();
       }
       if ((state == TelephonyManager.CALL_STATE_IDLE) && _callStarted)
       {
            _callEndTime = new Date().getTime();
            _callDuration = _callEndTime - _callStartTime;
            _minutes = (_callDuration / 1000) / 60;
            _seconds = (_callDuration / 1000) % 60;
            Toast.makeText(context, "Stage 2: " + "IDLE State->Boolean: "+_callStarted, Toast.LENGTH_LONG).show();
       }
   }

}

Android Манифест. xml указан ниже

 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.callerApppackage.callerapp">

  <uses-permission android:name="android.permission.CALL_PHONE" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />

        </intent-filter>

    </activity>

    <!-- put this here so that even if the app is not running,
    your app can be woken up if there is a change in phone
    state -->
    <receiver android:name=".PhoneStateReceiver">
        <intent-filter>
            <action
                android:name=
                    "android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>


</application>

Класс PhonestateReciver равен приведены ниже

public class PhoneStateReceiver extends BroadcastReceiver {
    TelephonyManager manager;
    PhoneReceiver myPhoneStateListener;
    static boolean alreadyListening = false;

    @Override
    public void onReceive(Context context, Intent intent) {
        myPhoneStateListener = new PhoneReceiver(context);
        manager = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE));

        //---do not add the listener more than once---
        if (!alreadyListening) {
            manager.listen(myPhoneStateListener,
                PhoneStateListener.LISTEN_CALL_STATE);
            alreadyListening = true;
        }
    }
}

Надеюсь, я дал понять, Спасибо всем заранее за более ранний ответ.

...