问题描述
我正在用 c#(在 Visual Studio 环境中)编写设备所有者应用程序,我需要创建清除其他应用程序数据的函数。 我已经用谷歌搜索了如何在 c# 中使用 DevicePolicyManager.ClearapplicationUserData,但我发现唯一有用的是:
private void clearapplicationUserData(String packageName) {
mDevicePolicyManager.clearapplicationUserData(mAdminComponentName,packageName,new MainThreadExecutor(),(__,succeed) -> showToast(succeed ? R.string.clear_app_data_success : R.string.clear_app_data_failure,packageName));
}
(来源:https://github.com/googlesamples/android-testdpc/blob/master/app/src/main/java/com/afwsamples/testdpc/policy/PolicyManagementFragment.java;行:3382-3391)
我将其从 java 转换为 c# 并收到此错误: 错误 CS1660 无法将 lambda 表达式转换为类型“DevicePolicyManager.IOnClearapplicationUserDataListener”,因为它不是委托类型
public static void ClearapplicationUserData(string pkg)
{
IExecutor executor = Executors.NewSingleThreadExecutor();
devicePolicyManager.ClearapplicationUserData(Admin,pkg,executor,(strPKG,boolSUCCESS) => Log.Debug("ClearapplicationUserData",boolSUCCESS ? "SUCCESS" : "FAIL"));
}
看起来这应该可行,但我不知道如何使“侦听器”非空
public static void ClearapplicationUserData(string pkg)
{
IExecutor executor = Executors.NewSingleThreadExecutor();
DevicePolicyManager.IOnClearapplicationUserDataListener listener;
devicePolicyManager.ClearapplicationUserData(Admin,listener);
}
我试过了:
devicePolicyManager.ClearapplicationUserData(Admin,(DevicePolicyManager.IOnClearapplicationUserDataListener)((strPKG,"-")));
错误 CS1660 无法将 lambda 表达式转换为类型“DevicePolicyManager.IOnClearapplicationUserDataListener”,因为它不是委托类型
devicePolicyManager.ClearapplicationUserData(Admin,(Action<DevicePolicyManager.IOnClearapplicationUserDataListener>)((strPKG,"-")));
错误 CS1593 委托 'Action
devicePolicyManager.ClearapplicationUserData(Admin,(Action<DevicePolicyManager.IOnClearapplicationUserDataListener>)((AAAA) => Log.Debug("ClearapplicationUserData","-")));
错误 CS1503 参数 4:无法从“System.Action
devicePolicyManager.ClearApplicationUserData(Admin,delegate { (DevicePolicyManager.IOnClearApplicationUserDataListener)((AAAA) => Log.Debug("ClearApplicationUserData","-")); });
错误 CS1660 无法将匿名方法转换为类型“DevicePolicyManager.IOnClearApplicationUserDataListener”,因为它不是委托类型
可能有帮助:
[Register("clearapplicationUserData","(Landroid/content/ComponentName;Ljava/lang/String;Ljava/util/concurrent/Executor;Landroid/app/admin/DevicePolicyManager$OnClearapplicationUserDataListener;)V","GetClearapplicationUserData_Landroid_content_ComponentName_Ljava_lang_String_Ljava_util_concurrent_Executor_Landroid_app_admin_DevicePolicyManager_OnClearapplicationUserDataListener_Handler",ApiSince = 28)]
public virtual void ClearapplicationUserData(ComponentName? admin,string? packageName,IExecutor? executor,IOnClearapplicationUserDataListener? listener);
....
....
....
[Register("android/app/admin/DevicePolicyManager$OnClearapplicationUserDataListener","","Android.App.Admin.DevicePolicyManager/IOnClearapplicationUserDataListenerInvoker",ApiSince = 28)]
public interface IOnClearapplicationUserDataListener : IJavaObject,Idisposable,IJavaPeerable
{
[Register("onApplicationUserDataCleared","(Ljava/lang/String;Z)V","GetonApplicationUserDataCleared_Ljava_lang_String_ZHandler:Android.App.Admin.DevicePolicyManager/IOnClearapplicationUserDataListenerInvoker,Mono.Android,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null",ApiSince = 28)]
void OnApplicationUserDataCleared(string? packageName,bool succeeded);
}
public class ClearapplicationUserDataEventArgs : EventArgs
{
public ClearapplicationUserDataEventArgs(string? packageName,bool succeeded);
public string? PackageName { get; }
public bool Succeeded { get; }
}
解决方法
这有效
public class ClearApplicationUserDataListener : Java.Lang.Object,DevicePolicyManager.IOnClearApplicationUserDataListener
{
public void OnApplicationUserDataCleared(string packageName,bool succeeded) { }
}
public static void ClearApplicationUserData(string pkg)
{
IExecutor executor = Executors.NewSingleThreadExecutor();
var listener = new ClearApplicationUserDataListener();
devicePolicyManager.ClearApplicationUserData(Admin,pkg,executor,listener);
}