我试图创建一个应用程序,它将使用BroadcastReciver捕获到手机的来电。从我的BroadcastReciver我想使用this方法将数字作为事件发送到我的JS文件。
我已经检查过我的Java代码正在运行并且正在捕获调用和数字,但是我的应用程序因错误而提到反应上下文为空。我猜这是因为当捕获来自android系统的事件并且新实例没有ReactContext时,清单(或某物)正在创建类的新实例。有没有办法从Java代码访问ReactContext或通过清单发送ReactContext到BroadcastReciver?
这是我的BroadcastReciver:
package com.bridgetest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.bridge.JavaScriptModule;
import android.widget.Toast;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.Arguments;
import javax.annotation.Nullable;
/**
* Created by Erik on 2016-04-06.
*/
public class BroadcastReceiverCustom extends BroadcastReceiver {
ReactContext reactContext;
public BroadcastReceiverCustom (){
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
// This code will execute when the phone has an incoming call
// get the phone number
String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
Toast.makeText(context, "Call from:" +incomingNumber, Toast.LENGTH_LONG).show();
sendCallEvent(incomingNumber);
} else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_IDLE)
|| intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_OFFHOOK)) {
// This code will execute when the call is disconnected
Toast.makeText(context, "Detected call hangup event", Toast.LENGTH_LONG).show();
}
}
public void sendCallEvent(String incomingNumber){
WritableMap params = Arguments.createMap();
params.putString("Number", incomingNumber);
sendEvent("CallRecevied", params);
}
private void sendEvent(String eventName,
@Nullable WritableMap params) {
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, params);
}
}
答案 0 :(得分:1)
我解决了这个问题。我使用singleton pattern创建了ReactContextBaseJavaModule
,并通过它访问了ReactContext
(这可能是一个巨大的" nono")。
如果有另一种更聪明的方法可以解决这个问题,请通知我。
答案 1 :(得分:0)
我遇到了同样的问题,并且正在使用它。
((MainApplication)getApplication()).getReactNativeHost().getReactInstanceManager().getCurrentReactContext()
答案 2 :(得分:0)
由于Fury的解决方案在广播接收器中对我不起作用(getApplication()出现“找不到符号”),因此我尝试应用与我知道有效的逻辑类似的逻辑。所以:
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.ReactApplication;
...
// context - is the context you get from broadcastreceivers onReceive
ReactApplication rnApp = (ReactApplication) context.getApplicationContext();
rnApp.getReactNativeHost().getReactInstanceManager()
.getCurrentReactContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit("test", Arguments.createMap());
这对我有用。