Я делаю код для телефонных звонков. Все успешно, кроме того, что я не могу получить системное время, когда 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;
}
}
}
Надеюсь, я дал понять, Спасибо всем заранее за более ранний ответ.