Commit f448a33a authored by Administrator's avatar Administrator

添加悬浮窗,增加app权重,避免后台不允许访问网络。避免app被杀

parent daf3f7c7
......@@ -37,7 +37,10 @@ android {
lintOptions {
abortOnError false
}
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
exclude 'META-INF/INDEX.LIST'
exclude 'META-INF/io.netty.versions.properties'
......@@ -53,4 +56,12 @@ dependencies {
implementation 'commons-io:commons-io:2.6'
implementation "com.virjar.majora:majora-sdk:1.0"
// 权限请求框架:https://github.com/getActivity/XXPermissions
implementation 'com.github.getActivity:XXPermissions:11.6'
// 悬浮窗框架:https://github.com/getActivity/XToast
implementation 'com.github.getActivity:XToast:8.1'
}
......@@ -3,6 +3,16 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.virjar.majora.adr">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 前台服务,保持安排的优先级 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".TheApp"
android:allowBackup="false"
......@@ -26,11 +36,6 @@
android:enabled="true"
android:exported="false" />
</application>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 前台服务,保持安排的优先级 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
\ No newline at end of file
package com.virjar.majora.adr;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.hjq.xtoast.XToast;
import com.hjq.xtoast.draggable.SpringDraggable;
import java.util.List;
public class MainActivity extends Activity {
......@@ -22,7 +32,39 @@ public class MainActivity extends Activity {
SettingsActivity.go(MainActivity.this);
}
});
showRatelFloatWindow();
}
/**
* 设置一个应用外悬浮窗,因为安卓10之后对后台启动activity具有限制
* https://developer.android.com/guide/components/activities/background-starts
* <p>
* {@link TheApp#checkFloatPermission(Context) 需要授予悬浮窗权限} (Context)},
* {@link TheApp#canBackgroundStart(Context) 或者miui等在设置中给予后台启动Activity权限}
*/
private void showRatelFloatWindow() {
XXPermissions.with(this)
.permission(Permission.SYSTEM_ALERT_WINDOW)
.request(new OnPermissionCallback() {
@Override
public void onGranted(List<String> granted, boolean all) {
// 传入 Application 表示这个是一个全局的 Toast
new XToast<>(TheApp.getApplication())
.setView(R.layout.toast_phone)
.setGravity(Gravity.END | Gravity.BOTTOM)
.setYOffset(200)
// 设置指定的拖拽规则
.setDraggable(new SpringDraggable())
.show();
}
@Override
public void onDenied(List<String> denied, boolean never) {
}
});
}
}
package com.virjar.majora.adr;
import android.app.AppOpsManager;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.Build;
import android.os.Process;
import android.provider.Settings;
import android.widget.Toast;
import com.virjar.majora.client.sdk.log.MajoraLogger;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TheApp extends Application {
private static TheApp theApp;
......@@ -14,7 +27,67 @@ public class TheApp extends Application {
super.onCreate();
theApp = this;
KeepAliveService.startService(this);
if (!checkFloatPermission(this)) {
MajoraLogger.getLogger().info("请给软件设置悬浮窗权限,否则可能影响后台网络!");
Toast.makeText(getApplicationContext(), "请给软件设置悬浮窗权限,否则可能影响后台网络!", Toast.LENGTH_SHORT).show();
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(intent);
}
}
if (!canBackgroundStart(this)) {
Toast.makeText(getApplicationContext(), "请给软件设置允许后台启动页面权限,否则可能影响后台网络!", Toast.LENGTH_SHORT).show();
}
}
private boolean checkFloatPermission(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
try {
Class cls = Class.forName("android.content.Context");
Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE");
declaredField.setAccessible(true);
Object obj = declaredField.get(cls);
if (!(obj instanceof String)) {
return false;
}
String str2 = (String) obj;
obj = cls.getMethod("getSystemService", String.class).invoke(context, str2);
cls = Class.forName("android.app.AppOpsManager");
Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED");
declaredField2.setAccessible(true);
Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class);
int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName());
return result == declaredField2.getInt(cls);
} catch (Exception e) {
return false;
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
if (appOpsMgr == null)
return false;
int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context
.getPackageName());
return mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED;
} else {
return Settings.canDrawOverlays(context);
}
}
}
private boolean canBackgroundStart(Context context) {
AppOpsManager ops = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
try {
int op = 10021; // >= 23
// ops.checkOpNoThrow(op, uid, packageName)
Method method = ops.getClass().getMethod("checkOpNoThrow", int.class, int.class, String.class);
Integer result = (Integer) method.invoke(ops, op, Process.myUid(), context.getPackageName());
return result == AppOpsManager.MODE_ALLOWED;
} catch (Exception e) {
MajoraLogger.getLogger().info("not support exec checkOpNoThrow", e);
return true;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/icon"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@mipmap/ic_launcher" />
\ No newline at end of file
......@@ -45,6 +45,11 @@ allprojects {
url "https://maven.aliyun.com/repository/google"
}
maven {
name "aliyunJCenter"
url "https://maven.aliyun.com/repository/jcenter"
}
maven { url 'https://jitpack.io' }
maven {
name "IntMaven"
url "http://nexus.virjar.com/repository/maven-public/"
}
......@@ -55,8 +60,3 @@ allprojects {
task clean(type: Delete) {
delete rootProject.buildDir
}
ext {
ratelEngineVersionCode = 5
ratelEngineVersion = "1.2.2"
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment