Skip to content

Commit a5dd69f

Browse files
committed
[Android][AutoSignIn] Update the V1.1
1. Add usage state manager permission check 2. Can get the current APP name 3. Fix JD & JDF some issues 4. Add relaunch function when is not at the sign in app
1 parent d33733f commit a5dd69f

12 files changed

+179
-95
lines changed

.idea/vcs.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/AndroidManifest.xml

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools"
34
package="com.pyy.signin">
45

56
<application
@@ -44,5 +45,8 @@
4445
</service>
4546
</application>
4647

48+
<uses-permission
49+
android:name="android.permission.PACKAGE_USAGE_STATS"
50+
tools:ignore="ProtectedPermissions"/>
4751

4852
</manifest>

app/src/main/java/com/pyy/signin/AppAdapter.java

+5-17
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.pyy.signin;
22

33
import android.content.Context;
4-
import android.os.Looper;
5-
import android.util.Log;
6-
import android.view.Gravity;
74
import android.view.LayoutInflater;
85
import android.view.View;
96
import android.view.ViewGroup;
@@ -13,7 +10,6 @@
1310
import android.widget.CompoundButton;
1411
import android.widget.ImageView;
1512
import android.widget.TextView;
16-
import android.widget.Toast;
1713

1814
import java.util.ArrayList;
1915

@@ -35,13 +31,6 @@ class AppAdapter extends ArrayAdapter<AppInfo> {
3531
showCnt = 0;
3632
}
3733

38-
private void showToast(String text) {
39-
Toast toast = Toast.makeText(getContext(),
40-
text, Toast.LENGTH_LONG);
41-
toast.setGravity(Gravity.CENTER, 0, 0);
42-
toast.show();
43-
}
44-
4534
@Override
4635
public int getCount() {
4736
return appList.size();
@@ -74,15 +63,14 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
7463
appInfo.chosen = true;
7564
switch (appInfo.appName) {
7665
case "京东":
77-
showToast("京东:当签到助手进入到签到界面后,用户手动点击签到。" +
66+
Utils.showToast("京东:当签到助手进入到签到界面后,用户手动点击签到。" +
7867
"然后双击右上角分享按钮,签到助手才会继续。\n" +
79-
"所有等待用户点击都会有20秒超时。");
68+
"所有等待用户点击都会有20秒超时。", getContext());
8069
break;
8170
case "京东金融":
82-
showToast("京东金融:设置手势密码的,需要用户手动解锁,助手会30秒超时。\n" +
83-
"签到领京豆后点击\"京豆明细\"触发助手继续自动化;" +
84-
"钢蹦需要用户手动领取,领取之后点击左上角X按钮触发助手继续。\n" +
85-
"所有等待用户点击都会有20秒超时。");
71+
Utils.showToast("京东金融:设置手势密码的,需要用户手动解锁,助手会30秒超时。\n" +
72+
"进入签到界面后有10秒钟签到\n" +
73+
"之后会进入钢蹦明细,用户有30秒手动领取钢蹦,领取之后点击左上角X按钮触发助手退出.", getContext());
8674
break;
8775
default:
8876
break;

app/src/main/java/com/pyy/signin/AppInfo.java

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import android.content.pm.PackageInfo;
66
import android.content.pm.PackageManager;
77
import android.graphics.drawable.Drawable;
8-
import android.widget.CheckBox;
98

109
import java.util.ArrayList;
1110
import java.util.List;

app/src/main/java/com/pyy/signin/MainPage.java

+30-19
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,17 @@
11
package com.pyy.signin;
22

33
import android.app.Activity;
4-
import android.app.AlertDialog;
4+
import android.app.AppOpsManager;
55
import android.content.Context;
6-
import android.content.DialogInterface;
76
import android.content.Intent;
87
import android.content.pm.PackageManager;
8+
import android.os.Build;
99
import android.os.Bundle;
10-
import android.os.Looper;
1110
import android.provider.Settings;
12-
import android.support.annotation.NonNull;
13-
import android.util.Log;
14-
import android.view.Gravity;
15-
import android.view.LayoutInflater;
1611
import android.view.View;
17-
import android.view.ViewGroup;
18-
import android.widget.ArrayAdapter;
1912
import android.widget.Button;
20-
import android.widget.CheckBox;
21-
import android.widget.CompoundButton;
22-
import android.widget.ImageView;
2313
import android.widget.ListView;
24-
import android.widget.TextView;
25-
import android.widget.Toast;
26-
27-
import java.io.DataOutputStream;
2814
import java.util.ArrayList;
29-
import java.util.concurrent.ThreadFactory;
30-
import java.util.concurrent.TimeUnit;
3115
import java.util.concurrent.locks.Condition;
3216
import java.util.concurrent.locks.Lock;
3317
import java.util.concurrent.locks.ReentrantLock;
@@ -43,11 +27,15 @@ public class MainPage extends Activity {
4327
static Lock lock = new ReentrantLock();
4428
static Condition condition = lock.newCondition();
4529
static boolean flag = false;
30+
private static final int REQUEST_PACKAGE_USAGE_STATS_PERMISSION = 1010;
4631

4732
@Override
4833
protected void onCreate(Bundle savedInstanceState) {
4934
super.onCreate(savedInstanceState);
5035
setContentView(R.layout.activity_main);
36+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
37+
checkPermission(REQUEST_PACKAGE_USAGE_STATS_PERMISSION);
38+
}
5139
Utils.checkSignInServiceEnabled(this);
5240
appListView = findViewById(R.id.appListView);
5341
Button start = findViewById(R.id.button);
@@ -60,6 +48,30 @@ public void onClick(View arg0) {
6048
});
6149
}
6250

51+
private void checkPermission(int requestCode) {
52+
if (requestCode == REQUEST_PACKAGE_USAGE_STATS_PERMISSION) {
53+
if (!hasPermission()) {
54+
//如果用户没有开启"可访问使用记录",则跳转到该设置项并提醒用户打开
55+
Utils.showToast("\"签到助手\"提示:\n请开启\"可访问使用记录\"权限", this);
56+
startActivityForResult(
57+
new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS),
58+
REQUEST_PACKAGE_USAGE_STATS_PERMISSION);
59+
}
60+
}
61+
}
62+
63+
//检测用户是否对本app开启了“Apps with usage access”权限
64+
private boolean hasPermission() {
65+
AppOpsManager appOps = (AppOpsManager)
66+
getSystemService(Context.APP_OPS_SERVICE);
67+
int mode = 0;
68+
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
69+
mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
70+
android.os.Process.myUid(), getPackageName());
71+
}
72+
return mode == AppOpsManager.MODE_ALLOWED;
73+
}
74+
6375
class SignInThread extends Thread {
6476
@Override
6577
public void run() {
@@ -92,7 +104,6 @@ private void autoSignIn(AppInfo info) {
92104
try {
93105
autoLaunch(info.packageName);
94106
condition.await();
95-
96107
} catch (InterruptedException e) {
97108
e.printStackTrace();
98109
}

app/src/main/java/com/pyy/signin/SignInService.java

+8-12
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
11
package com.pyy.signin;
22

33
import android.accessibilityservice.AccessibilityService;
4-
import android.util.Log;
54
import android.view.accessibility.AccessibilityEvent;
6-
import android.view.accessibility.AccessibilityNodeInfo;
7-
8-
import java.util.List;
9-
import java.util.concurrent.TimeUnit;
105
import java.util.concurrent.locks.Condition;
116
import java.util.concurrent.locks.Lock;
127
import java.util.concurrent.locks.ReentrantLock;
138

14-
import static com.pyy.signin.Utils.delay;
159
import static com.pyy.signin.Utils.prt;
1610

1711
/**
@@ -25,7 +19,7 @@ public class SignInService extends AccessibilityService {
2519
static Condition autoCondition = autoLock.newCondition();
2620
autoSignInJD jd = new autoSignInJD();
2721
autoSignInSMZDM smzdm = new autoSignInSMZDM();
28-
autoSignInJDJR jdjr = new autoSignInJDJR();
22+
autoSignInJDF jdf = new autoSignInJDF();
2923
autoSignInTXDM txdm = new autoSignInTXDM();
3024

3125
@Override
@@ -34,8 +28,10 @@ public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
3428
//prt("Event: " + accessibilityEvent);
3529
if (accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED) {
3630
//Log.i(logTag, "CINDY " + accessibilityEvent);
37-
if ("com.jd.jrapp".equals(fgPackageName) && (accessibilityEvent.getText().equals("京豆明细")
38-
|| !accessibilityEvent.getText().toString().contains("签到"))) {
31+
if ("com.jd.jrapp".equals(fgPackageName) && (!accessibilityEvent.getText().toString().equals("签到")
32+
&& !accessibilityEvent.getText().toString().equals("钢蹦明细")
33+
&& accessibilityEvent.getClassName().equals("android.widget.Button"))) {
34+
prt("" + accessibilityEvent);
3935
autoLock.lock();
4036
autoCondition.signal();
4137
autoLock.unlock();
@@ -54,8 +50,8 @@ public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
5450
}
5551

5652
if (accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED
57-
&& "com.jd.jrapp".equals(fgPackageName) && jdjr.gestureLockFlag) {
58-
jdjr.gestureLockFlag = false;
53+
&& "com.jd.jrapp".equals(fgPackageName) && jdf.gestureLockFlag) {
54+
jdf.gestureLockFlag = false;
5955
autoLock.lock();
6056
autoCondition.signal();
6157
autoLock.unlock();
@@ -86,7 +82,7 @@ private void autoSign(AccessibilityEvent envent) {
8682
jd.doJD(this);
8783
break;
8884
case "com.jd.jrapp":
89-
jdjr.doJDJR(this);
85+
jdf.doJDF(this);
9086
break;
9187
case "com.smzdm.client.android":
9288
smzdm.doSMZDM(this);

app/src/main/java/com/pyy/signin/Utils.java

+56
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,30 @@
11
package com.pyy.signin;
22

3+
import android.accessibilityservice.AccessibilityService;
4+
import android.app.ActivityManager;
35
import android.app.AlertDialog;
6+
import android.app.usage.UsageStats;
7+
import android.app.usage.UsageStatsManager;
8+
import android.content.ComponentName;
49
import android.content.Context;
510
import android.content.DialogInterface;
611
import android.content.Intent;
712
import android.content.pm.ApplicationInfo;
813
import android.content.pm.PackageInfo;
914
import android.content.pm.PackageManager;
1015
import android.graphics.drawable.Drawable;
16+
import android.os.Build;
1117
import android.provider.Settings;
1218
import android.util.Log;
19+
import android.view.Gravity;
1320
import android.view.LayoutInflater;
1421
import android.view.View;
1522
import android.view.ViewGroup;
1623
import android.widget.ArrayAdapter;
1724
import android.widget.CheckBox;
1825
import android.widget.ImageView;
1926
import android.widget.TextView;
27+
import android.widget.Toast;
2028

2129
import java.util.ArrayList;
2230
import java.util.List;
@@ -34,6 +42,54 @@ public static void checkSignInServiceEnabled(Context context) {
3442
}
3543
}
3644

45+
public static void showToast(String text, Context context) {
46+
Toast toast = Toast.makeText(context,
47+
text, Toast.LENGTH_LONG);
48+
toast.setGravity(Gravity.CENTER, 0, 0);
49+
toast.show();
50+
}
51+
52+
public static void reLaunch(AccessibilityService service, String text) {
53+
prt(Utils.getTopApp(service.getApplicationContext()));
54+
if (!Utils.getTopApp(service.getApplicationContext()).equals(text)) {
55+
PackageManager packageManager = service.getApplicationContext().getPackageManager();
56+
Intent mBootUpIntent = packageManager.getLaunchIntentForPackage(text);
57+
mBootUpIntent.addCategory(Intent.CATEGORY_LAUNCHER);
58+
mBootUpIntent.setAction(Intent.ACTION_MAIN);
59+
//mBootUpIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
60+
service.startActivity(mBootUpIntent);
61+
}
62+
}
63+
64+
public static String getTopApp(Context context) {
65+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // 5.0及之后的方法
66+
UsageStatsManager usm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
67+
if (usm != null) {
68+
long now = System.currentTimeMillis();
69+
// 获取40秒之内的应用程序使用状态
70+
List<UsageStats> stats = usm.queryUsageStats(UsageStatsManager.INTERVAL_BEST, now - 40 * 1000, now);
71+
String topActivity = "";
72+
// 获取最新运行的程序
73+
if ((stats != null) && (!stats.isEmpty())) {
74+
int j = 0;
75+
for (int i = 0; i < stats.size(); i++) {
76+
if (stats.get(i).getLastTimeUsed() > stats.get(j).getLastTimeUsed()) {
77+
j = i;
78+
}
79+
}
80+
topActivity = stats.get(j).getPackageName();
81+
return topActivity;
82+
}
83+
}
84+
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){ // 5.0之前的方法
85+
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
86+
ComponentName cn = activityManager.getRunningTasks(1).get(0).topActivity;
87+
return cn.getPackageName();
88+
}
89+
return "Not found!";
90+
}
91+
92+
3793
public static void showAlertInfo(final Context context) {
3894
new AlertDialog.Builder(context).setTitle("温馨提示")//设置对话框标题
3995
.setMessage("使用签到助手请开启辅助功能中的签到助手服务开关")//设置显示的内容

0 commit comments

Comments
 (0)