Unity获取IOS端相机权限的状态

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32225289/article/details/82465074

最近项目遇到了如果用户不提供iPhone的相机权限,游戏则无法正常进行的问题。所以为了解决这个问题,自己想出的方法是获取IOS上相机权限的状态,在Unity端通过获取到ios相机权限的状态进行处理,未开启权限给与提示让用户提供权限再进行游戏。

所以为了解决这个问题,自己通过咨询发现需要编写oc代码来获取状态,再从unity中调用OC代码。经过自己的学习,总结出了流程:

1.首先,需要了解Unity端是如何调用oc代码的。我们先编写脚本,用于调用oc代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.InteropServices;

public class IOSCameraAuthority : MonoBehaviour {
    public static IOSCameraAuthority ins;
    public enum CameraStatus 
    {
        UnAuthority=0,
        Authority=1,
        Denied=2,
        None=3,
    }
    [DllImport("__Internal")]
    public static extern int GetAVCapturePermission();
    void Awake() 
    {
        ins = this;
    }

    public CameraStatus GetCameraAuthorityStatus() 
    {
        int status= GetAVCapturePermission();
        switch (status) 
        {
            case 0:
                return CameraStatus.UnAuthority;
            case 1:
                return CameraStatus.Authority;
            case 2:
                return CameraStatus.Denied;
            default:
                return CameraStatus.None;
        }
    }
}

最重要的是

    [DllImport("__Internal")]
    public static extern int GetAVCapturePermission();

这个方法是与ios端交互的关键所在。

2.既然调用的代码写好了,接下来我们需要写oc代码。我们需要的是".h"文件以及".mm"文件。将这两个文件放在Unity项目的Plugins文件夹的iOS文件夹下,一定不要放错位置。

接下来晒出头文件的代码

JCamera.h

#import<Foundation/Foundation.h>
@interface JCamera:NSObject
@end

最重要的OC代码:

JCamera.mm

#import "JCamera.h"
#import <AVFoundation/AVFoundation.h>
#import <AVFoundation/AVCaptureDevice.h>
@implementation JCamera

extern "C" int GetAVCapturePermission()
{
    NSString* mediaType = AVMediaTypeVideo;

    NSInteger status = AVAuthorizationStatusAuthorized;

    status = [AVCaptureDevice authorizationStatusForMediaType: mediaType];

    if (status == AVAuthorizationStatusNotDetermined)
	{
		status=0;
		return 0;
	}

    else if (status == AVAuthorizationStatusAuthorized)
    {
		status=1;
		return 1;
	}
    else if(status==AVAuthorizationStatusDenied)
    {
        status=2;
        return 2;
    }else
    {
        status=0;
        return 0;
        
    }
    
	//UnitySendMessage("PublicGameObject","GetAVCapturePermission",status)
}

@end

注意OC代码的这个方法一定要与前面Unity脚本中的DllImport那个方法名字一样。这样就能获取到相机授权状态是未授权,还是授权过了,还是拒绝授权了。

猜你喜欢

转载自blog.csdn.net/qq_32225289/article/details/82465074