防外挂 方案是 获取android设备上正在运行的应用进程,如果有被列为黑名称的app在运行 就跳出提示有外挂程序运行,匹配app 的方法的按照app 的名字和app 的包名 进行匹配,不废话上代码
C#
public class PlugAppInfo //app 数据类
{
public string name;
public string package;
public PlugAppInfo() { }
public PlugAppInfo(string _name, string _package)
{
name = _name;
package = _package;
}
}
void OnApplicationFocus(bool isFocus) //这里在应用每次激活的时候做一次检查为了防止玩家在启动游戏之后,在开启外挂,又重新进入游戏
{
bool isflag = false;
string appname = "";
string data = DeviceUtil.GetUserTask();
if (data != "" && data != null)
{
List<PlugAppInfo> appinfos = new List<PlugAppInfo>(); //这里是用来存储正在运行次app 名称和包名
string[] list = data.Split(';');
for (int i = 0; i < list.Length; i++)
{
if (list[i] != null && list[i] != "")
{
string[] flag = list[i].Split(',');
if (flag.Length >= 2)
{
PlugAppInfo appinfo = new PlugAppInfo();
appinfo.name = flag[0];
appinfo.package = flag[1];
if (appinfo.name != "" && appinfo.package != "")
{
appinfos.Add(appinfo);
}
}
}
}
List<PlugAppInfo> PlugAppInfos = new List<PlugAppInfo>(); //这里是用来保存已经被列为黑名单的app名称个包名
PlugAppInfos.Add(new PlugAppInfo("支付宝", "com.eg.android.AlipayGphone"));
for (int j = 0; j < PlugAppInfos.Count; j++)
{
for (int i = 0; i < appinfos.Count; i++)
{
if (appinfos[i].name.Trim().ToLower() == SystemData.PlugAppInfos[j].name.Trim().ToLower() || appinfos[i].package.Trim().ToLower() == SystemData.PlugAppInfos[j].package.Trim().ToLower())
{
appname = appinfos[i].name + "," + appinfos[i].package;
isflag = true;
break;
}
}
if (isflag)
{
break;
}
}
}
if (isflag)
{
IsPlugInTesting = true;
// 警告 有外挂 这里可以跳出提示框 获取是OnExitGame 你懂的
}
}
public static string GetUserTask() //获取正在运行app方法
{
string task = "";
#if UNITY_ANDROID
try
{
AndroidJavaClass up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = up.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass unityPluginLoader = new AndroidJavaClass("java类全名");
task = unityPluginLoader.CallStatic<string>("GetAllTask", currentActivity,true);
}
catch (System.Exception e)
{
}
#endif
return task;
}
Java
public static List<TaskBean> getTask4(Activity currentActivity) {
List<TaskBean> taskList = new ArrayList<TaskBean>();
ActivityManager mActivityManager = (ActivityManager) currentActivity.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runList = mActivityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo r : runList) {
TaskBean taskBean = new TaskBean();
String processName = r.processName;
if (!processName.equals("自己app的包名") && !processName.equals("白名单app的包名"))//获取应用的时候排除自己 {
taskBean.PackageName = processName;
PackageInfo packageInfo = null;
try {
packageInfo = currentActivity.getPackageManager().getPackageInfo(processName, 0);
} catch (Throwable e) {
Utile.LogError(e.getLocalizedMessage());
}
if (packageInfo != null) {
taskBean.Name = currentActivity.getPackageManager().getApplicationLabel(packageInfo.applicationInfo)
.toString();
if (!filterApp(packageInfo.applicationInfo)) {
taskBean.IsUser = false;
} else {
taskBean.IsUser = true;
if (taskList != null) {
taskList.add(taskBean);
}
}
}
}
}
return taskList;
}
public static List<TaskBean> getTask5(Activity currentActivity) {
List<AndroidAppProcess> processInfos = ProcessManager.getRunningAppProcesses();
List<TaskBean> taskinfos = new ArrayList<TaskBean>();
// 遍历运行的程序,并且获取其中的信息
for (AndroidAppProcess processInfo : processInfos) {
TaskBean taskBean = new TaskBean();
// 应用程序的包名
String packname = processInfo.name;
if (!packname.equals("自己app的包名") && !packname.equals("白名单app的包名")) //获取应用的时候排除自己{
taskBean.PackageName = processInfo.getPackageName();
// 获取应用程序信息
ApplicationInfo applicationInfo = null;
try {
applicationInfo = currentActivity.getPackageManager().getApplicationInfo(packname, 0);
} catch (PackageManager.NameNotFoundException e) {
// TODO Auto-generated catch block
if (Utile.isDebug())
Utile.LogError(e.getLocalizedMessage());
// 系统内核进程 没有名称
}
if (applicationInfo != null) {
taskBean.Name = currentActivity.getPackageManager().getApplicationLabel(applicationInfo).toString();
if (filterApp(applicationInfo)) {
// 用户进程
taskBean.IsUser = true;
if (taskinfos != null) {
taskinfos.add(taskBean);
}
} else {
// 系统进程
taskBean.IsUser = false;
}
}
}
}
return taskinfos;
}
public static String GetAllTask(Activity currentActivity, boolean isUser) {
List<TaskBean> taskinfos = null;
if (Build.VERSION.SDK_INT < 21) { //为了兼容不同的android系统
taskinfos = getTask4(currentActivity);
} else {
taskinfos = getTask5(currentActivity);
}
try {
Intent intent = new Intent();
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setAction(Intent.ACTION_MAIN);
List<ResolveInfo> resolveInfos = currentActivity.getPackageManager().queryIntentActivities(intent, 0);
if (resolveInfos.size() > 0) {
List<TaskBean> newtaskinfos = new ArrayList<TaskBean>();
for (int i = 0; i < resolveInfos.size(); i++) {
ResolveInfo resolveInfo = resolveInfos.get(i);
if (filterApp(resolveInfo.activityInfo.applicationInfo)) {
for (TaskBean taskBean : taskinfos) {
if (taskBean.PackageName.equals(resolveInfo.activityInfo.applicationInfo.packageName)) {
TaskBean newtaskBean = new TaskBean();
newtaskBean.Name = resolveInfo.loadLabel(currentActivity.getPackageManager())
.toString();
newtaskBean.PackageName = resolveInfo.activityInfo.applicationInfo.packageName;
newtaskBean.IsUser = true;
newtaskinfos.add(newtaskBean);
}
}
}
}
taskinfos = newtaskinfos;
}
} catch (Exception e) {
if (Utile.isDebug())
Utile.LogError(e.toString());
}
String ret = "";
if (taskinfos != null) {
int index = 0;
for (TaskBean taskBean : taskinfos) {
if (index != 0) {
ret += ";";
}
ret += taskBean.Name + "," + taskBean.PackageName;
index++;
}
}
return ret;
}