【问题标题】:React native "Attempt to invoke virtual method 'android.app.Activity.showdShowRequestPermissionRationale' on a null object reference"反应本机“尝试在空对象引用上调用虚拟方法'android.app.Activity.showdShowRequestPermissionRationale'”
【发布时间】:2017-09-30 01:12:36
【问题描述】:

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

尝试调用虚拟方法'boolean android.app.Activity.shouldShowRequestPermissionRationale' 为空 对象引用 screenshot here

我已将<uses-permission android:name="android.permission.RECORD_AUDIO" /> 包含在AndroidManifest.xml

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

这几天一直在摸不着头脑,非常感谢任何帮助。

我的 Twilio 助手类的代码 sn-p:

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;
}

【问题讨论】:

  • 您是否在 API 级别低于 22 的 Android 上进行测试?我想ActivityCompat 是那时才添加的。
  • 我正在测试的设备是 Android 6.0 版本,所以应该对应 API 级别 23 对吧?较低的 API 级别是否有可能存在于较高的 android 版本上?
  • 抱歉,我不是真正的 Android 开发者,所以帮不上忙。您可能想在react-native-twilio-programmable-voice repo 上尝试一个问题,它正在积极维护,您可能会在那里找到更多指导。

标签: android react-native twilio


【解决方案1】:

我一直在使用同一个库来处理与 React Native 的集成。我对尝试这种集成感到痛苦,因为在此过程中会遇到很多问题。我在让Android端处理权限时遇到了这个问题。

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

自发布此问题以来已进行了许多更新,因此用户必须注意 Twilio Voice for iOS (Pods)、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)
  }
}

祝你好运!

【讨论】:

    【解决方案2】:

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

    类似这样的:

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

    【讨论】:

      【解决方案3】:

      我有相同类型的问题,但略有不同尝试在 null 上调用接口方法“expo.modules.interfaces.barcodescanner.BarCodeScannerInterface expo.modules.interfaces.barcodescanner.BarCodeScannerProviderInterface.createBarCodeDetectorWithContext(android.content.Context)”对象引用

      ℹ️ 将 expo-camera 从 12.1.0 降级到 12.0.3 后,问题似乎不再出现。

      【讨论】:

      • 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
      【解决方案4】:

      我通过启动一个新的 react native 项目来解决这个问题,因为它让我省去了寻找未知解决方案的所有压力

      【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2019-05-10
      • 2015-06-26
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多