Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

File tree

12 files changed

+179
-95
lines changed

12 files changed

+179
-95
lines changed

‎.idea/vcs.xml‎

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎app/src/main/AndroidManifest.xml‎

Lines changed: 4 additions & 0 deletions
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‎

Lines changed: 5 additions & 17 deletions
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‎

Lines changed: 0 additions & 1 deletion
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‎

Lines changed: 30 additions & 19 deletions
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‎

Lines changed: 8 additions & 12 deletions
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-
autoSignInJDJRjdjr = new autoSignInJDJR();
22+
autoSignInJDFjdf = 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‎

Lines changed: 56 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /