2016-04-19 7 views
2

私はアプリケーションを作成しようとすると、BroadcastReciverを使用して携帯電話への着信コールをキャッチします。私のBroadcastReciverから、thisメソッドを使用してJSファイルにイベントとして番号を送信したいと思っています。React NativeのJavaコードからReactContextにアクセスするにはどうすればよいですか?

私はJavaコードが動作していることを確認し、呼び出しと番号をキャッチしていますが、私のアプリケーションでは、反応コンテキストがnullであることを示すエラーが発生しています。これは、アンドロイドシステムのイベントがキャッチされ、新しいインスタンスにReactContextがない場合、マニフェスト(または何か)がクラスの新しいインスタンスを作成しているためです。 JavaコードからReactContextにアクセスする方法や、ReactContextをManifest経由で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

したがって、反応コンテキストが動作していないネイティブコンテキストの単純なラッピングは可能ですか?私はこのような意味です:ReactContext reactContext =(ReactContext)context; – MadChuckle

+0

私はその時に働くことができませんでした。 :/私はアプリケーションの構造を変更して、非モジュールのJavaコードからネイティブコンテキストにアクセスする必要がなくなり、全く問題に遭遇することはありませんでした。私は次の時間を徹底的に試してみましょう:Dお返事ありがとう! –

答えて

1

私は問題を解決しました。私はsingleton patternと​​を作成し、それを介してReactContext(これは巨大な "ノー"かもしれない)へのアクセスを得た。

この問題を解決するもう少しスマートな方法がある場合は、私に知らせてください。