Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
M
majora-adr
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
majora
majora-adr
Commits
f448a33a
Commit
f448a33a
authored
Sep 12, 2021
by
Administrator
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加悬浮窗,增加app权重,避免后台不允许访问网络。避免app被杀
parent
daf3f7c7
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
148 additions
and
11 deletions
+148
-11
build.gradle
app/build.gradle
+12
-1
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+10
-5
MainActivity.java
app/src/main/java/com/virjar/majora/adr/MainActivity.java
+42
-0
TheApp.java
app/src/main/java/com/virjar/majora/adr/TheApp.java
+73
-0
toast_phone.xml
app/src/main/res/layout/toast_phone.xml
+6
-0
build.gradle
build.gradle
+5
-5
No files found.
app/build.gradle
View file @
f448a33a
...
...
@@ -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'
}
app/src/main/AndroidManifest.xml
View file @
f448a33a
...
...
@@ -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
app/src/main/java/com/virjar/majora/adr/MainActivity.java
View file @
f448a33a
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
)
{
}
});
}
}
app/src/main/java/com/virjar/majora/adr/TheApp.java
View file @
f448a33a
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
;
}
}
}
app/src/main/res/layout/toast_phone.xml
0 → 100644
View file @
f448a33a
<?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
build.gradle
View file @
f448a33a
...
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment