如何使用 DevicePolicyManager.ClearApplicationUserData

问题描述

我正在用 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' 不接受 2 个参数

devicePolicyManager.ClearapplicationUserData(Admin,(Action<DevicePolicyManager.IOnClearapplicationUserDataListener>)((AAAA) => Log.Debug("ClearapplicationUserData","-")));

错误 CS1503 参数 4:无法从“System.Action”转换为“Android.App.Admin.DevicePolicyManager.IOnClearApplicationUserDataListener?”

devicePolicyManager.ClearApplicationUserData(Admin,delegate { (DevicePolicyManager.IOnClearApplicationUserDataListener)((AAAA) => Log.Debug("ClearApplicationUserData","-")); });

错误 CS1660 无法将匿名方法转换为类型“DevicePolicyManager.IOnClearApplicationUserDataListener”,因为它不是委托类型

可能有帮助:

https://developer.android.com/reference/android/app/admin/DevicePolicyManager#clearApplicationUserData(android.content.ComponentName,%20android.app.admin.DevicePolicyManager.OnClearApplicationUserDataListener)

https://developer.android.com/reference/android/app/admin/DevicePolicyManager.OnClearApplicationUserDataListener

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