目前自己已经使用过的API,记录一下,持续更新
目前picosdk版本305
using System;
using Unity.XR.PICO.TOBSupport;
using Unity.XR.PXR;
using UnityEngine;
using UnityEngine.XR;
public class PicoAPI : MonoBehaviour
{
public static PicoAPI _Instance;
private void Awake()
{
if (_Instance != null && _Instance != this)
{
Destroy(gameObject);
return;
}
_Instance = this;
PXR_Enterprise.InitEnterpriseService();
PXR_Enterprise.BindEnterpriseService();
}
private void OnDestroy()
{
PXR_Enterprise.UnBindEnterpriseService();
}
/// <summary>
/// 获得WakeLock锁
/// </summary>
public void AcquireWakeLock()
{
PXR_Enterprise.AcquireWakeLock();
}
/// <summary>
/// 校正视角
/// </summary>
public void TryRecenter()
{
InputDevices.GetDeviceAtXRNode(XRNode.Head).subsystem.TryRecenter();//校正视角
}
/// <summary>
/// 打开app
/// </summary>
public void OpenApp(string pkgname)
{
PXR_Enterprise.StartActivity(pkgname, "", "", "", new string[] { }, new int[] { });
}
/// <summary>
/// 开启投屏
/// </summary>
public void OpenTouPing()
{
//AndroidProcessData.OpenPackage(packageNmae, activity);
PXR_Enterprise.StartActivity("com.pvr.picocast", "com.pvr.picocast.view.CastMainActivity", "", "", new string[] { }, new int[] { });
}
/// <summary>
/// 开启wifi
/// </summary>
public void OpenWIFI()
{
PXR_Enterprise.StartVrSettingsItem(StartVRSettingsEnum.START_VR_SETTINGS_ITEM_WIFI, true, 0);
}
/// <summary>
/// 开启pico播放器
/// </summary>
public void PlayPicoVideo(string fileName)
{
AndroidJavaObject context = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject videoPlayer = new AndroidJavaObject("com.picovr.picoplaymanager.PicovrLaunchPlayer");
videoPlayer.Call<AndroidJavaObject>("uri", fileName, false).Call<AndroidJavaObject>("playTime", 0).Call<AndroidJavaObject>("scenes", 2).Call("launchVideoPlayer", context);
}
/// <summary>
/// 保持应用程序活跃
/// </summary>
public void AppKeepAlive(string appPackageName)
{
PXR_Enterprise.AppKeepAlive(appPackageName, true, 0);
}
/// <summary>
/// 设置应用作为启动程序
/// </summary>
public void SetAppAsHome(string pkgName)
{
PXR_Enterprise.SetAPPAsHome(SwitchEnum.S_ON, pkgName);
}
/// <summary>
/// 设置USB配置模式为MTP
/// </summary>
public void SetUSBConfigMode()
{
PXR_Enterprise.SwitchSetUsbConfigurationOption(USBConfigModeEnum.MTP);
}
/// <summary>
/// 强制退出应用
/// </summary>
public void KillAppsByPidOrPackageName(string pkgName)
{
PXR_Enterprise.KillAppsByPidOrPackageName(new int[] { }, new string[] { pkgName });
}
/// <summary>
/// 清除后台应用
/// </summary>
public void KillBackgroundAppsWithWhiteList(string pkgName)
{
PXR_Enterprise.KillBackgroundAppsWithWhiteList(new string[] { pkgName });
}
/// <summary>
/// 设置瞳距
/// </summary>
public void SetIpd(float ipd)
{
PXR_Enterprise.SetIPD(ipd, CallBack);
void CallBack(int code)
{
try
{
string installCode = code switch
{
1 => "失败",
2 => "不在有效范围",
_ => "成功",
};
Debug.Log($"设置瞳距: {installCode}");
}
catch (Exception e)
{
Debug.LogError($"设置瞳距异常: {e.Message}");
}
}
}
#region 打开关闭重启软件
/// <summary>
/// 通过包名调用其他软件
/// </summary>
/// <param name="pkgName">应用包名</param>
/// <param name="activity">AndroidJavaObject</param>
public void OpenPackage(string pkgName, AndroidJavaObject activity = null)
{
if (activity == null)
{
using (AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
activity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
}
}
using (AndroidJavaObject joPackageManager = activity.Call<AndroidJavaObject>("getPackageManager"))
{
using (AndroidJavaObject joIntent = joPackageManager.Call<AndroidJavaObject>("getLaunchIntentForPackage", pkgName))
{
if (null != joIntent)
{
activity.Call("startActivity", joIntent);
}
else
{
Debug.Log("未安装此软件:" + pkgName);
}
}
}
}
/// <summary>
/// 是否安装了此app
/// </summary>
public bool IsAppInstalled(string packageName)
{
try
{
using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
{
using (AndroidJavaObject packageManager = currentActivity.Call<AndroidJavaObject>("getPackageManager"))
{
AndroidJavaObject packageInfo = null;
try
{
packageInfo = packageManager.Call<AndroidJavaObject>("getPackageInfo", packageName, 0);
}
catch (AndroidJavaException e)
{
// Application is not installed
}
return packageInfo != null;
}
}
}
}
catch (Exception e)
{
Debug.LogError($"检查应用是否安装时发生异常: {e.Message}");
return false;
}
}
/// <summary>
/// 获取apk包名
/// </summary>
public string GetPackageNameFromApk(string apkFilePath)
{
using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
{
using (AndroidJavaObject packageManager = currentActivity.Call<AndroidJavaObject>("getPackageManager"))
{
using (AndroidJavaObject packageInfo = packageManager.Call<AndroidJavaObject>("getPackageArchiveInfo", apkFilePath, 0))
{
if (packageInfo != null)
{
AndroidJavaObject applicationInfo = packageInfo.Get<AndroidJavaObject>("applicationInfo");
string packageName = applicationInfo.Get<string>("packageName");
return packageName;
}
return null;
}
}
}
}
}
#endregion
#region 关闭安全边界
/// <summary>
/// 关闭边界
/// </summary>
public void OffBoundary()
{
PXR_Boundary.SetGuardianSystemDisable(false);
}
#endregion
#region 设置手柄震动
/// <summary>
/// 设置手柄震动
/// </summary>
/// <param name="vibrateType">手柄</param>
/// <param name="amplitude">振幅</param>
/// <param name="duration">持续时间</param>
/// <param name="frequency">震动频率</param>
public void SetControllerVibration(PXR_Input.VibrateType vibrateType, float amplitude, int duration, int frequency = 150)
{
PXR_Input.SendHapticImpulse(vibrateType, amplitude, duration, frequency);
}
/// <summary>
/// 获得手柄电量 0是左手柄,1是右手柄
/// </summary>
/// <returns></returns>
public int[] GetControllerBattery()
{
return PXR_Enterprise.GetControllerBattery();
}
#endregion
#region 静默安装/卸载apk
/// <summary>
/// 静默安装apk
/// </summary>
public void InstallApk(string path)
{
if (!string.IsNullOrEmpty(path))
{
PXR_Enterprise.ControlAPPManager(PackageControlEnum.PACKAGE_SILENCE_INSTALL, path, CallBack);
}
void CallBack(int code)
{
try
{
string installCode = code switch
{
1 => "失败",
2 => "无此操作权限",
_ => "成功",
};
Debug.Log($"静默安装apk的路径: {installCode}");
}
catch (Exception e)
{
Debug.LogError($"静默安装apk时出现异常: {e.Message}");
}
}
}
/// <summary>
/// 静默卸载app
/// </summary>
public void UnInstallApp(string appPackageName)
{
PXR_Enterprise.ControlAPPManager(PackageControlEnum.PACKAGE_SILENCE_UNINSTALL, appPackageName, CallBack);
void CallBack(int code)
{
try
{
string unInstallCode = code switch
{
1 => "失败",
2 => "无此操作权限",
_ => "成功",
};
Debug.Log($"静默卸载app包名: {unInstallCode}");
}
catch (Exception e)
{
Debug.LogError($"静默卸载apk时出现异常: {e.Message}");
}
}
}
#endregion
#region 获取设备信息
/// <summary>
/// pico设备SN
/// </summary>
public string PicoSN()
{
return StateGetDeviceInfo(SystemInfoEnum.EQUIPMENT_SN);
}
/// <summary>
/// pico设备电量
/// </summary>
public string PicoPower()
{
return StateGetDeviceInfo(SystemInfoEnum.ELECTRIC_QUANTITY);
}
/// <summary>
/// 充电状态
/// </summary>
/// <returns>“2”是充电中,“3”是没充电</returns>
public string ChargingStatus()
{
return StateGetDeviceInfo(SystemInfoEnum.CHARGING_STATUS);
}
/// <summary>
/// pico设备WIFI状态
/// </summary>
public string PicoWIFIState()
{
return StateGetDeviceInfo(SystemInfoEnum.DEVICE_WIFI_STATUS);
}
/// <summary>
/// 获取设备信息
/// </summary>
string StateGetDeviceInfo(SystemInfoEnum infoEnum)
{
return PXR_Enterprise.StateGetDeviceInfo(infoEnum);
}
/// <summary>
/// 调节亮度
/// </summary>
void SetCommonBrightness(float Ilight)
{
PXR_System.SetCommonBrightness(int.Parse(Ilight.ToString()));
}
/// <summary>
/// 获得亮度
/// </summary>
int GetCommonBrightness()
{
return PXR_System.GetCommonBrightness();
}
#endregion
#region 控制设备关机或重启
/// <summary>
/// 控制设备关机或重启
/// </summary>
void ControlDeviceShutDownOrReboot(DeviceControlEnum deviceControlEnum)
{
PXR_Enterprise.ControlSetDeviceAction(deviceControlEnum, callback);
void callback(int obj)
{
try
{
string Code = obj switch
{
1 => "失败",
2 => "无此操作权限",
_ => "成功",
};
Debug.Log($"控制设备关机或重启: {Code}");
}
catch (Exception e)
{
Debug.LogError($"控制设备关机或重启时出现异常: {e.Message}");
}
}
}
/// <summary>
/// 关机
/// </summary>
public void ShutDown()
{
ControlDeviceShutDownOrReboot(DeviceControlEnum.DEVICE_CONTROL_SHUTDOWN);
}
/// <summary>
/// 重启
/// </summary>
public void Reboot()
{
ControlDeviceShutDownOrReboot(DeviceControlEnum.DEVICE_CONTROL_REBOOT);
}
#endregion
#region 设置Home按钮事件
/// <summary>
/// 设置home按钮无效
/// </summary>
public void SetHomeNoAvail()
{
PropertySetHomeKey(HomeEventEnum.SINGLE_CLICK, HomeFunctionEnum.VALUE_HOME_DISABLE);
}
/// <summary>
/// 设置home按钮默认
/// </summary>
public void RemoveControllerHomeKey()
{
PXR_Enterprise.RemoveControllerHomeKey(HomeEventEnum.SINGLE_CLICK);
}
/// <summary>
/// 设置Home按钮事件
/// </summary>
public void PropertySetHomeKey(HomeEventEnum eventEnum, HomeFunctionEnum function)
{
PXR_Enterprise.PropertySetHomeKey(eventEnum, function, callback);
void callback(bool obj)
{
try
{
string Code = obj switch
{
false => "失败",
_ => "成功",
};
Debug.Log($"设置Home按钮事件: {Code}");
}
catch (Exception e)
{
Debug.LogError($"设置Home按钮事件时出现异常: {e.Message}");
}
}
}
#endregion
#region 设置设备永不休眠永不息屏
/// <summary>
/// 设置设备不使用时屏幕关闭的时间
/// </summary>
void PropertySetScreenOffDelay(ScreenOffDelayTimeEnum timeEnum)
{
PXR_Enterprise.PropertySetScreenOffDelay(timeEnum, callback);
void callback(int obj)
{
try
{
string Code = obj switch
{
0 => "成功",
2 => "失败",
10 => "应小于系统休眠时间",
_ => "异常"
};
Debug.Log($"设置设备不使用时屏幕关闭的时间: {Code}");
}
catch (Exception e)
{
Debug.LogError($"设置设备不使用时屏幕关闭的时间时出现异常: {e.Message}");
}
}
}
/// <summary>
/// 设置设备不使用时系统休眠时间
/// </summary>
void PropertySetSleepDelay(SleepDelayTimeEnum timeEnum)
{
PXR_Enterprise.PropertySetSleepDelay(timeEnum);
}
/// <summary>
/// 设置设备永不休眠永不息屏
/// </summary>
public void NeverSleepScreenOff()
{
PropertySetSleepDelay(SleepDelayTimeEnum.NEVER);//永不休眠
PropertySetScreenOffDelay(ScreenOffDelayTimeEnum.NEVER);//永不息屏
}
#endregion
#region 打开/关闭指定的系统功能
/// <summary>
/// 打开/关闭指定的系统功能
/// </summary>
void SwitchSystemFunction(SystemFunctionSwitchEnum systemFunctionSwitchEnum, SwitchEnum switchEnum)
{
PXR_Enterprise.SwitchSystemFunction(systemFunctionSwitchEnum, switchEnum);
}
/// <summary>
/// 手势重定位开关
/// </summary>
public void HandRecenter()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_GESTURE_RECOGNITION_RESET_ENABLE, SwitchEnum.S_OFF);
}
/// <summary>
/// 手势Home
/// </summary>
public void HandHome()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_GESTURE_RECOGNITION_HOME_ENABLE, SwitchEnum.S_OFF);
}
/// <summary>
/// 开启USB调试
/// </summary>
public void OnUSBDebugging()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_USB, SwitchEnum.S_ON);
}
/// <summary>
/// 关闭自动休眠
/// </summary>
public void OffAutoSleep()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_AUTOSLEEP, SwitchEnum.S_OFF);
}
/// <summary>
/// 关闭系统升级
/// </summary>
public void OffSystemUpdate()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_SYSTEM_UPDATE, SwitchEnum.S_OFF);
}
/// <summary>
/// 关闭自动杀后台VR应用
/// </summary>
public void OffKillVRapp()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_BASIC_SETTING_KILL_BACKGROUND_VR_APP, SwitchEnum.S_OFF);
}
/// <summary>
/// 关闭导航栏
/// </summary>
public void OffNavgation()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_NAVGATION_SWITCH, SwitchEnum.S_OFF);
}
/// <summary>
/// 打开导航栏
/// </summary>
public void OpenNavgation()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_NAVGATION_SWITCH, SwitchEnum.S_ON);
}
/// <summary>
/// 关闭快速透视
/// </summary>
public void OffSeethroughMode()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_QUICK_SEETHROUGH_MODE, SwitchEnum.S_OFF);
}
public void OnSeethroughMode()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_QUICK_SEETHROUGH_MODE, SwitchEnum.S_ON);
}
/// <summary>
/// 设备休眠或关闭时保持网络连接
/// </summary>
public void OnPowerCtrlWIFIEnable()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_POWER_CTRL_WIFI_ENABLE, SwitchEnum.S_ON);
}
/// <summary>
/// 关闭系统软件升级
/// </summary>
public void OffSystemUpdateApp()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_SYSTEM_UPDATE_APP, SwitchEnum.S_OFF);
}
/// <summary>
/// 关闭应用程序退出对话框
/// </summary>
public void OffAppQuitConfirmDialog()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_BASIC_SETTING_SHOW_APP_QUIT_CONFIRM_DIALOG, SwitchEnum.S_OFF);
}
/// <summary>
/// 打开应用程序退出对话框
/// </summary>
public void OpenAppQuitConfirmDialog()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_BASIC_SETTING_SHOW_APP_QUIT_CONFIRM_DIALOG, SwitchEnum.S_ON);
}
/// <summary>
/// 关闭6DoF位置跟踪
/// </summary>
public void OffSixDof()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_SIX_DOF_SWITCH, SwitchEnum.S_OFF);
}
public void OnSixDof()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_SIX_DOF_SWITCH, SwitchEnum.S_ON);
}
/// <summary>
/// 关闭音量UI
/// </summary>
public void OffOnVolumeUI()
{
SwitchSystemFunction(SystemFunctionSwitchEnum.SFS_VOLUME_UI, SwitchEnum.S_OFF);
}
#endregion
#region 设置音量
/// <summary>
/// 获取最大音量
/// </summary>
public int GetMaxVolumeNumber()
{
return PXR_System.GetMaxVolumeNumber();
}
/// <summary>
/// 获取当前音量
/// </summary>
public int GetCurrentVolumeNumber()
{
return PXR_System.GetCurrentVolumeNumber();
}
/// <summary>
/// 增加音量
/// </summary>
public void VolumeUp()
{
PXR_System.VolumeUp();
}
/// <summary>
/// 减小音量
/// </summary>
public void VolumeDown()
{
PXR_System.VolumeDown();
}
/// <summary>
/// 设置音量
/// </summary>
public void SetVolumeNum(int volume)
{
PXR_System.SetVolumeNum(volume);
}
/// <summary>
/// 音量设置到最大值
/// </summary>
public void SetVolumeMaxNum()
{
SetVolumeNum(GetMaxVolumeNumber());
}
#endregion
/// <summary>
/// 投屏地址
/// </summary>
public string GetCastUrl()
{
PXR_Enterprise.PICOCastInit(null);
return PXR_Enterprise.PICOCastGetUrl(PICOCastUrlTypeEnum.NO_CONFIRM_URL);
}
}
pico用到过的权限
**<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
<!-- 添加PICO高风险接口权限:有静默安装卸载,关机重启,杀死应用,清理后台应用,Rom离线升级 -->
<meta-data android:name="pico_advance_interface" android:value="0"/>
</application>
<!-- 添加读写权限 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<!-- 添加蓝牙和 BLE 权限 -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>
**