Мне нужен плагин, который прослушивает входящий вызов, этот плагин необходим для работы с cordova-plugin-tts, потому что при поступлении вызова в текстовом формате речь остается незаметной.
Я новичок в разработке плагинов Cordova, Java и даже Android-студии.
У меня была смелость попробовать этот плагин, я сражаюсь с ним уже больше месяца. Это стало задачей проб и ошибок.
Ниже приведена последняя попытка Java-кода и предоставление намерений в plugin.xml
.
package com.caller.notifier;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.*;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.content.Intent;
import android.telephony.TelephonyManager;
public class speechNotify extends CordovaPlugin {
private static int lastState = TelephonyManager.CALL_STATE_IDLE;
private static boolean isIncoming;
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
super.initialize(cordova, webView);
IntentFilter intentFilter = new IntentFilter();
intentFilter.notify();
BroadcastReceiver receiver;
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
int state = 0;
if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)){
state = TelephonyManager.CALL_STATE_IDLE;
}
else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
state = TelephonyManager.CALL_STATE_OFFHOOK;
}
else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){
state = TelephonyManager.CALL_STATE_RINGING;
}
onCallStateChanged(state);
}
};
cordova.getActivity().registerReceiver(receiver, intentFilter);
}
private void onIncomingCallStarted(){
webView.loadUrl("javascript:cordova.fireDocumentEvent('incoming-call');");
}
private void onIncomingCallEnded(){
webView.loadUrl("javascript:cordova.fireDocumentEvent('call-ended');");
}
private void onMissedCall(){
webView.loadUrl("javascript:cordova.fireDocumentEvent('call-ended');");
}
//Incoming call- goes from IDLE to RINGING when it rings, to OFFHOOK when it's answered, to IDLE when its hung up
private void onCallStateChanged(int state) {
if(lastState == state){
//No change, debounce extras
return;
}
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
isIncoming = true;
onIncomingCallStarted();
break;
case TelephonyManager.CALL_STATE_IDLE:
//Went to idle- this is the end of a call. What type depends on previous state(s)
if(lastState == TelephonyManager.CALL_STATE_RINGING){
onMissedCall();
}
else if(isIncoming){
onIncomingCallEnded();
}
break;
}
lastState = state;
}
}
А в плагине .XML
<config-file target="AndroidManifest.xml" parent="/*">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
</config-file>
<config-file target="AndroidManifest.xml" parent="/manifest/application">
<receiver android:name=".CallReceiver" >
<intent-filter> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter>
</receiver>
</config-file>
Этот код вылетает из приложения. Этот плагин может быть простой задачей для экспертов Cordova. Кто-то должен, пожалуйста, спасти меня.