React native"尝试调用虚方法' android.app.Activity.showdShowRequestPermissionRationale'在null对象引用"

时间:2017-09-30 01:12:36

标签: android react-native twilio

我尝试使用react-native-twilio-programmable-voice包合并Twilio语音。我的应用程序在ios上加载,但在android上运行时我收到此错误消息

  

尝试调用虚方法' boolean   android.app.Activity.shouldShowRequestPermissionRationale'在null   对象参考   screenshot here

我在<uses-permission android:name="android.permission.RECORD_AUDIO" />

中加入了AndroidManifest.xml

并且在进入应用程序的4或5个屏幕之前,不会调用任何与TwilioVoice相关的函数。

现在已经抓了几天,非常感谢任何帮助。

我的Twilio助手类的代码片段:

import TwilioVoice from 'react-native-twilio-programmable-voice';
import {Platform} from 'react-native';

import config from '../config/Config';

export default class Voip{

  constructor(props) {
      this.state = {

  };
}

  async setupDeviceWithToken(accessToken){
    console.log('V32: setup device', accessToken);
    TwilioVoice.addEventListener('deviceReady', () => this.deviceReadyHandler());
    TwilioVoice.addEventListener('deviceNotReady', () => this.deviceNotReadyHandler());
    TwilioVoice.addEventListener('connectionDidConnect', () => this.connectionDidConnectHandler());
    TwilioVoice.addEventListener('connectionDidDisconnect', () => this.connectionDidDisconnectHandler());

if(Platform.OS === 'ios')
{
  TwilioVoice.addEventListener('callRejected', this.callRejected());
} else if (Platform.OS === 'android')
{
  TwilioVoice.addEventListener('deviceDidReceiveIncoming', this.deviceDidReceiveIncomingHandler());
}
var success;
try {
      success = await TwilioVoice.initWithToken(accessToken);
      console.log('V36: ', success);
      //return success;
  }
catch(err){
      console.log('V40: ' ,err);
      return err;
  }

  // if(Platform.OS === 'ios')
  // {
      try {
          TwilioVoice.configureCallKit({
              appName:       'VoipApp'                  // Required param
          })
          console.log('V50: ios success');
          //return 'success';
      }
      catch (err) {
          console.log('V54: ',err);
          return err;
      }
  // }
  return success;
}

2 个答案:

答案 0 :(得分:0)

我一直在使用相同的库来处理与React Native的集成。尝试这种整合让我感到痛苦,因为沿途有很多打嗝。让Android方处理权限时,我遇到了这个问题。

我发现可以通过React Native on Android处理权限。我在Android上注释了权限调用并切换到React Native实现,这对我有用。

自此问题发布以来已有很多更新,因此用户必须注意在Twilio Voice for iOS(Pod),Android和React Native包装器之间使用的版本。我最终要求库控制合并的内容,因为每个方面都在积极开发中。

async function requestMicrophonePermission() {
  try {
    const granted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
      {
        'title': `${name} Microphone Permission`,
        'message': `${name} needs access to your microphone 
                   'so you can talk.`
      }
    )
    if (granted === PermissionsAndroid.RESULTS.GRANTED) {
      console.log("Microphone permission granted")
    } else {
      console.log("Microphone permission denied")
    }
  } catch (err) {
    console.warn(err)
  }
}

祝你好运!

答案 1 :(得分:0)

我遇到了同样的问题,在详细检查了代码之后,我发现权限请求是在TwilioVoiceModule的构造函数中进行的,那时,ActivityCompat可能还没有被初始化(BTW,我是一个iOS开发人员,没有在Android上工作太多)。所以我创建了一个@ReactMethod,它要求权限,并在我到达调用屏幕后在ReactNative中调用该方法。

这样的事情:

    @ReactMethod
    public void askForMicrophones() {
      if (!checkPermissionForMicrophone()) {
        requestPermissionForMicrophone();
      }
    }