我正在开发 React Native 应用程序来检测所有呼叫状态但是

问题描述 投票:0回答:2

我正在使用react-native-call-detection库

** 但呼叫已连接和呼叫拨号状态仅在 IOS 中有效,请指导我如何在 Android 中检测它 **

  • 我是 React Native 新手,请指导我如何检测 React Native 中的呼叫所有状态,我找到了 recat-native-call-detection 库,但它不提供所有状态信息 n*
 const startStopListener = () => {
    if (isStart) {
      console.log('Stop');
      callDetector && callDetector.dispose();
    } else {
      console.log('Start');
      callDetector = new CallDetectorManager(
        async (event, number) => {
          console.log('event -> ', event + (number ? ' - ' + number : ''));
          var updatedCallStates = callStates;
          updatedCallStates.push(event + (number ? ' - ' + number : ''));
          setFlatListItems(updatedCallStates);
          setCallStates(updatedCallStates);
          if (event === 'Disconnected') {
            // Do something call got disconnected
          } else if (event === 'Connected') {
            console.log('  // Do something call got incoming');
            // This clause will only be executed for iOS
          } else if (event === 'Incoming') {
            console.log('  // Do something call got incoming');
            // Do something call got incoming
          } else if (event === 'Dialing') {
            // This clause will only be executed for iOS
          } else if (event === 'Offhook') {
            
          } else if (event === 'Missed') {
            
            // This clause will only be executed for Android
          }
        },
        true, // To detect incoming calls [ANDROID]
        () => {
          // If your permission got denied [ANDROID]
          // Only if you want to read incoming number

          console.log('Permission Denied by User');
        },
        {
          title: 'Phone State Permission',
          message:
            'This app needs access to your phone state in order to react and/or to adapt to incoming calls.',
        },
      );
    }
    setIsStart(!isStart);
  };
react-native call phone-call detect
2个回答
1
投票

我的正在运行Android 12.0.0

  • 我按照本教程了解了 Android 权限 Tute
  • 我的代码:
/* eslint-disable react-native/no-inline-styles */

    import React, {useState, useEffect} from 'react';
    import {generalStyles} from '../generalStyles';
    import {StyleSheet, Text, View, PermissionsAndroid, Switch} from 'react-native';
    import CallDetectorManager from 'react-native-call-detection';
    
    export const CallDetection = () => {
      const [featureOn, setFeatureOn] = useState(false);
      //Set States of StarListener
      const [incoming, setIncoming] = useState(false);
      const [offhook, setOffhook] = useState(false);
      const [disconnected, setDisconnected] = useState(false);
      const [missed, setMissed] = useState(false);
    
      const [number, setNumber] = useState('');
      const [event, setEvent] = useState('');
      const [isEnabled, setIsEnabled] = useState(false);
      const toggleSwitch = () => {
        setIsEnabled(previousState => !previousState);
        isEnabled ? stopListenerTapped() : startListenerTapped();
      };
    
      useEffect(() => {
        askPermission();
      });
    
      askPermission = async () => {
        try {
          const permissions = await PermissionsAndroid.requestMultiple([
            PermissionsAndroid.PERMISSIONS.READ_CALL_LOG,
            PermissionsAndroid.PERMISSIONS.READ_PHONE_STATE,
          ]);
          // console.log('Permissions are:', permissions);
        } catch (err) {
          console.warn(err);
        }
      };
    
      startListenerTapped = () => {
        setFeatureOn(true);
    
        console.log(`just STARTED listening calls\n\t feature is ${featureOn}`);
        let callDetector = new CallDetectorManager(
          (event, number) => {
            setNumber(number);
            setEvent(event);
            if (event === 'Disconnected') {
              setDisconnected(true);
            } else if (event === 'Incoming') {
              setIncoming(true);
            } else if (event === 'Offhook') {
              setOffhook(true);
            } else if (event === 'Missed') {
              setMissed(true);
            }
          },
          true, // if you want to read the phone number of the incoming call [ANDROID], otherwise false
          () => {}, // callback if your permission got denied [ANDROID] [only if you want to read incoming number] default: console.error
          {
            title: 'Phone State Permission',
            message:
              'This app needs access to your phone state in order to react and/or to adapt to incoming calls.',
          },
        );
      };
    
    
    
      let status;
      if (incoming && missed) {
        console.log('------- Incoming Missed Call');
        setIncoming(false);
        setMissed(false);
        status = 'Incoming Missed Call';
      }
    
      if (incoming && offhook & disconnected) {
        console.log('------- Incoming call Answered');
        setIncoming(false);
        setOffhook(false);
        setDisconnected(false);
      }
    
      if (offhook && disconnected && !incoming) {
        console.log('------- Outgoin Call');
        setOffhook(false);
        setDisconnected(false);
      }
    
      stopListenerTapped = () => {
        console.log(`just STOPED listening calls\n\t feature is ${featureOn}`);
        let callDetector = new CallDetectorManager();
        callDetector && callDetector.dispose();
        setFeatureOn(false);
      };
    
      return (
        <View style={generalStyles.body}>
          <Text style={styles.text}>Should the detection be on?</Text>
    
          <View style={styles.toggle}>
            <Switch
              style={{transform: [{scaleX: 2}, {scaleY: 2}]}}
              trackColor={{false: 'grey', true: 'white'}}
              thumbColor={isEnabled ? '#64fd1f' : '#f4f3f4'}
              ios_backgroundColor="#3e3e3e"
              onValueChange={toggleSwitch}
              value={isEnabled}
            />
          </View>
          <View style={styles.loggerInfoContainer}>
            {incoming && <Text style={styles.callerHeader}>Caller's Phone :</Text>}
            {incoming && (
              <Text style={{fontSize: 30, color: 'white'}}>{number}</Text>
            )}
          </View>
          {/* <Button title="fake call" onPress={() => {}}></Button> */}
        </View>
      );
    };
    
    const styles = StyleSheet.create({
      body: {
        backgroundColor: 'honeydew',
        justifyContent: 'center',
        alignItems: 'center',
        flex: 1,
      },
      text: {
        padding: 20,
        fontSize: 20,
      },
      button: {},
      toggle: {
        marginTop: 30,
        marginBottom: 30,
      },
    
      loggerInfoContainer: {
        width: '80%',
        height: 150,
        backgroundColor: '#101010',
        display: 'flex',
        alignItems: 'center',
        justifyContent: 'center',
        borderRadius: 8,
      },
    
      callerHeader: {
        fontSize: 18,
        color: '#ecf0f1',
      },
    });


0
投票

该库在 Android 12 中停止工作,我直接向其创建者开了一张票,但他没有回复。 (我也有同样的情况)

© www.soinside.com 2019 - 2024. All rights reserved.