Skip to content

Commit 4ea67fc

Browse files
committed
添加文件选中工具类
1 parent 701a9c6 commit 4ea67fc

34 files changed

+7764
-2048
lines changed

README.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ allprojects {
1717
```groovy
1818
dependencies {
1919
//多个物联网相关基础工具类
20-
implementation 'com.github.wave-chtj:BaseIotUtils:2.7.0'
20+
implementation 'com.github.wave-chtj:BaseIotUtils:2.7.1'
2121
}
2222
```
2323

@@ -93,9 +93,23 @@ public class App extends Application {
9393
| 31 | UriPathUtils | Uri 转真实路径 | android7.0uri 转换 |
9494
| 32 | ZipUtils | 压缩相关 | 压缩解压,批量等 |
9595
| 33 | PopupWindowTools | 气泡提示 | 某个控件的上,下,左,右弹出 |
96+
| 34 | CodeUtils | 二维码,条形码生成 | 按条件生成二维码,条形码 |
97+
| 35 | FileDialogSelectUtils | 文件多选返回 | 递归选中文件夹下文件 |
9698

9799
## base_iotutils 工具调用方式,及图片展示
98100

101+
#### FileDialogSelectUtils 递归多选文件夹下文件
102+
103+
```java
104+
FileDialogSelectUtils fileDialogSelectUtils =new FileDialogSelectUtils(this, new File("/sdcard/"), new FileDialogSelectUtils.FileSelectCallback() {
105+
@Override
106+
public void onFileSelected(List<File> selected) {
107+
Log.d(TAG, "onFileSelected: "+selected);
108+
}
109+
}).setSizeRatio(0.3f,0.5f);//比例
110+
fileDialogSelectUtils.show();
111+
```
112+
99113
#### PopupWindowTools 气泡提示
100114

101115
```java

app/proguardMapping.txt

Lines changed: 6612 additions & 2009 deletions
Large diffs are not rendered by default.

app/src/main/AndroidManifest.xml

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
<uses-permission
8181
android:name="android.permission.WRITE_SETTINGS"
8282
tools:ignore="ProtectedPermissions" />
83+
<uses-permission android:name="android.permission.TETHER_PRIVILEGED"/>
8384
<uses-permission
8485
android:name="android.permission.WRITE_SECURE_SETTINGS"
8586
tools:ignore="ProtectedPermissions" />
@@ -379,16 +380,46 @@
379380
android:exported="true"
380381
android:launchMode="singleTop"
381382
android:theme="@style/AppTheme" />
383+
382384
<activity
383385
android:name=".webviews.WebViewAty"
384386
android:enabled="true"
385387
android:exported="true"
386388
android:launchMode="singleTop"
387389
android:theme="@style/AppTheme" />
388390

391+
<activity android:name=".test.ReadImeiAty"
392+
android:enabled="true"
393+
android:exported="true"
394+
android:launchMode="singleTop"
395+
android:theme="@style/AppTheme"/>
396+
397+
<activity android:name=".accessibility.AccessibilityControlAty"
398+
android:enabled="true"
399+
android:exported="true"
400+
android:launchMode="singleTop"
401+
android:theme="@style/AppTheme" />
402+
389403
<meta-data
390404
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
391405
android:resource="@xml/usb_accessory_filter" />
406+
<service android:name=".accessibility.AccessibilityControlService"
407+
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
408+
android:exported="true">
409+
<intent-filter>
410+
<action android:name="android.accessibilityservice.AccessibilityService" />
411+
</intent-filter>
412+
413+
<meta-data
414+
android:name="android.accessibilityservice"
415+
android:resource="@xml/accessibility_service_config" />
416+
</service>
417+
418+
<service
419+
android:name=".accessibility.ScreenRecordService"
420+
android:foregroundServiceType="mediaProjection"
421+
android:exported="false"
422+
android:enabled="true"/>
392423
<!--在服务里面进行一些application应该执行的初始化操作-->
393424
<service
394425
android:name=".application.InitializeService"
@@ -425,8 +456,8 @@
425456
android:name=".util.BaseIotReceiver"
426457
android:enabled="true"
427458
android:exported="true">
428-
<intent-filter android:priority="1000">
429-
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
459+
<intent-filter>
460+
<action android:name="android.intent.action.BOOT_COMPLETED" />
430461
</intent-filter>
431462
</receiver>
432463
<provider

app/src/main/java/com/ichtj/basetools/MainActivity.java

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
import android.os.Bundle;
66
import android.os.Environment;
77
import android.os.Handler;
8+
import android.text.TextUtils;
9+
import android.util.Log;
810
import android.view.Gravity;
9-
import android.widget.Button;
1011
import android.widget.Toast;
1112

1213
import androidx.annotation.Nullable;
14+
import androidx.core.content.ContextCompat;
1315

1416
import com.alibaba.android.arouter.facade.annotation.Route;
15-
import com.chtj.base_framework.FScreentTools;
1617
import com.chtj.base_framework.FStorageTools;
1718
import com.chtj.base_framework.entity.CommonValue;
1819
import com.chtj.base_framework.entity.IpConfigInfo;
@@ -23,15 +24,20 @@
2324
import com.face_chtj.base_iotutils.AudioUtils;
2425
import com.face_chtj.base_iotutils.BaseIotUtils;
2526
import com.face_chtj.base_iotutils.DeviceUtils;
27+
import com.face_chtj.base_iotutils.DisplayUtils;
28+
import com.face_chtj.base_iotutils.FileDialogSelectUtils;
2629
import com.face_chtj.base_iotutils.GlobalDialogUtils;
2730
import com.face_chtj.base_iotutils.KLog;
2831
import com.face_chtj.base_iotutils.NetUtils;
2932
import com.face_chtj.base_iotutils.NotifyUtils;
33+
import com.face_chtj.base_iotutils.ShellUtils;
3034
import com.face_chtj.base_iotutils.TPoolSingleUtils;
3135
import com.face_chtj.base_iotutils.TPoolUtils;
36+
import com.face_chtj.base_iotutils.TimeUtils;
3237
import com.face_chtj.base_iotutils.ToastUtils;
3338
import com.face_chtj.base_iotutils.UriPathUtils;
3439
import com.face_chtj.base_iotutils.callback.IDismissListener;
40+
import com.face_chtj.base_iotutils.code.CodeUtils;
3541
import com.face_chtj.base_iotutils.view.OnPopupItemClickListener;
3642
import com.ichtj.basetools.allapp.AllAppAty;
3743
import com.ichtj.basetools.audio.AudioAty;
@@ -59,6 +65,7 @@
5965
import com.ichtj.basetools.timer.TimerAty;
6066
import com.ichtj.basetools.touch.TouchDetectAty;
6167
import com.face_chtj.base_iotutils.view.PopupWindowTools;
68+
import com.ichtj.basetools.util.BasicTools;
6269
import com.ichtj.basetools.util.CustomButtonGridView;
6370
import com.ichtj.basetools.util.FKey;
6471
import com.ichtj.basetools.util.JXLExcelUtils;
@@ -71,6 +78,7 @@
7178
import com.ichtj.basetools.video.VideoPlayAty;
7279
import com.ichtj.basetools.webviews.WebViewAty;
7380

81+
import java.io.File;
7482
import java.io.InputStream;
7583
import java.util.Arrays;
7684
import java.util.HashMap;
@@ -156,6 +164,9 @@ public Map<Integer, String> getDisplayBtn() {
156164
btnList.put (FKey.KEY_WEBVIEW_TEST, getString (R.string.main_test_webview));
157165
btnList.put (FKey.KEY_POPWINDOW, getString(R.string.main_popwindow_toast));
158166
btnList.put (FKey.KEY_DROP_POPWINDOW, getString(R.string.main_pull_down_option_box));
167+
btnList.put (FKey.KEY_QR_CODE, getString(R.string.main_qrcode_create));
168+
btnList.put (FKey.KEY_ORIENTATION, getString(R.string.main_screen_orientation));
169+
btnList.put (FKey.KEY_FILE_SELECT, getString(R.string.main_file_dialog_select));
159170
return btnList;
160171
}
161172

@@ -329,8 +340,9 @@ public void run() {
329340
}
330341
break;
331342
case FKey.KEY_SCREENSHOT:
332-
String imgPath = FScreentTools.takeScreenshot ("/sdcard/");
333-
if (imgPath != null && !imgPath.equals ("")) {
343+
String filePath="/sdcard/"+TimeUtils.getTodayDateHms("yyyyMMddHHmmss")+".png";
344+
boolean isSucc = DisplayUtils.screenshot(filePath);
345+
if (isSucc) {
334346
ToastUtils.success (getString(R.string.main_screenshot_succ_toast));
335347
} else {
336348
ToastUtils.error (getString(R.string.main_screenshot_failed));
@@ -431,7 +443,7 @@ public void run() {
431443
VIEW_FALG=0;
432444
}
433445
PopupWindowTools bubblePopupWindow = new PopupWindowTools(MainActivity.this);
434-
bubblePopupWindow.setBubbleText("这是一条气泡消息");
446+
bubblePopupWindow.setBubbleText(getString(R.string.main_pop_remarks));
435447
bubblePopupWindow.show(customButtonGridView.getSelectButton(), gravityValue);//view的上部展示
436448
break;
437449
case FKey.KEY_DROP_POPWINDOW:
@@ -444,9 +456,38 @@ public void onItemClick(int position, String itemText) {
444456
}
445457
});
446458
break;
459+
case FKey.KEY_QR_CODE:
460+
BasicTools.showTwoScaledBitmapsDialog(this,CodeUtils.createBarCode("www.baidu.com",200,100),CodeUtils.createQRCode("www.baidu.com",200, ContextCompat.getColor(this,R.color.black)));
461+
break;
462+
case FKey.KEY_ORIENTATION:
463+
ShellUtils.CommandResult rotationResult= ShellUtils.execCommand("settings get system user_rotation",true);
464+
Log.d(TAG, "rotationResult: result>>"+rotationResult.result+",succ>>"+rotationResult.successMsg+",err>>"+rotationResult.errorMsg);
465+
if (rotationResult.result==0&& !TextUtils.isEmpty(rotationResult.successMsg)){
466+
int rotationValue=0;
467+
try {
468+
rotationValue=Integer.parseInt(rotationResult.successMsg);
469+
}catch (Throwable throwable){
470+
}
471+
rotationValue++;
472+
if (rotationValue>3){
473+
rotationValue=0;
474+
}
475+
DisplayUtils.changeRotation(rotationValue);
476+
}
477+
break;
478+
case FKey.KEY_FILE_SELECT:
479+
FileDialogSelectUtils fileDialogSelectUtils =new FileDialogSelectUtils(this, new File("/sdcard/"), new FileDialogSelectUtils.FileSelectCallback() {
480+
@Override
481+
public void onFileSelected(List<File> selected) {
482+
Log.d(TAG, "onFileSelected: "+selected);
483+
}
484+
}).setSizeRatio(0.3f,0.5f);
485+
fileDialogSelectUtils.show();
486+
break;
447487
}
448488
}
449489

490+
450491
@Override
451492
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
452493
super.onActivityResult (requestCode, resultCode, data);
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.ichtj.basetools.accessibility;
2+
3+
import android.app.Activity;
4+
import android.content.Context;
5+
import android.content.Intent;
6+
import android.os.Bundle;
7+
import android.util.Log;
8+
import android.view.View;
9+
10+
import androidx.annotation.Nullable;
11+
12+
import com.alibaba.android.arouter.facade.annotation.Route;
13+
import com.face_chtj.base_iotutils.DisplayUtils;
14+
import com.face_chtj.base_iotutils.TimeUtils;
15+
import com.ichtj.basetools.R;
16+
import com.ichtj.basetools.util.PACKAGES;
17+
18+
@Route(path = PACKAGES.BASE + "accessibility")
19+
public class AccessibilityControlAty extends Activity {
20+
private static final String TAG = AccessibilityControlAty.class.getSimpleName();
21+
private static final int REQUEST_CODE_CAPTURE = 1001;
22+
private ScreenRecorderUtil screenRecorderUtil;
23+
@Override
24+
protected void onCreate(Bundle savedInstanceState) {
25+
super.onCreate(savedInstanceState);
26+
setContentView(R.layout.activity_remote_service);
27+
screenRecorderUtil = new ScreenRecorderUtil(this);
28+
screenRecorderUtil.requestCapturePermission(REQUEST_CODE_CAPTURE);
29+
}
30+
31+
@Override
32+
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
33+
if (requestCode == REQUEST_CODE_CAPTURE && resultCode == RESULT_OK && data != null) {
34+
screenRecorderUtil.startRecordingFromService(data, resultCode);
35+
}
36+
super.onActivityResult(requestCode, resultCode, data);
37+
}
38+
39+
public void startClick(View view){
40+
sendKeepAliveBroadcast(this,"com.android.settings",true);
41+
boolean isSucc=DisplayUtils.screenshot("/sdcard/"+ TimeUtils.getTodayDateHms("yyyyMMddHHmmss")+".png");
42+
Log.d(TAG, "startClick: isSucc>>"+isSucc);
43+
}
44+
45+
public void stopClick(View view){
46+
sendKeepAliveBroadcast(this,"com.android.settings",false);
47+
}
48+
49+
public static void sendKeepAliveBroadcast(Context context, String packageName, boolean enable) {
50+
Intent intent = new Intent("com.android.control.keepalive");
51+
intent.putExtra("packageName", packageName);
52+
intent.putExtra("enable", enable);//enable true开启 false关闭
53+
context.sendBroadcast(intent);
54+
}
55+
}
56+
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.ichtj.basetools.accessibility;
2+
3+
import android.accessibilityservice.AccessibilityService;
4+
import android.util.Log;
5+
import android.view.accessibility.AccessibilityEvent;
6+
import android.view.accessibility.AccessibilityNodeInfo;
7+
8+
import org.json.JSONObject;
9+
10+
import java.io.IOException;
11+
import java.io.PrintWriter;
12+
import java.net.Socket;
13+
14+
public class AccessibilityControlService extends AccessibilityService {
15+
private static final String TAG = AccessibilityControlService.class.getSimpleName();
16+
private Socket socket;
17+
private PrintWriter writer;
18+
19+
@Override
20+
public void onServiceConnected() {
21+
super.onServiceConnected();
22+
23+
new Thread(() -> {
24+
try {
25+
socket = new Socket("192.168.1.150", 8234); // 替换为你的服务器地址
26+
writer = new PrintWriter(socket.getOutputStream(), true);
27+
Log.d(TAG, "onServiceConnected: start");
28+
} catch (Throwable e) {
29+
Log.e(TAG, "Connection failed", e);
30+
}
31+
}).start();
32+
}
33+
34+
@Override
35+
public void onAccessibilityEvent(AccessibilityEvent event) {
36+
if (writer == null) return;
37+
38+
AccessibilityNodeInfo source = event.getSource();
39+
if (source == null) return;
40+
41+
Log.d(TAG, "onAccessibilityEvent: "+event);
42+
JSONObject json = new JSONObject();
43+
try {
44+
json.put("eventType", AccessibilityEvent.eventTypeToString(event.getEventType()));
45+
json.put("packageName", event.getPackageName());
46+
json.put("className", event.getClassName());
47+
json.put("text", event.getText().toString());
48+
json.put("contentDescription", source.getContentDescription());
49+
50+
writer.println(json.toString());
51+
} catch (Exception e) {
52+
Log.e(TAG, "JSON error", e);
53+
}
54+
}
55+
56+
@Override
57+
public void onInterrupt() {
58+
try {
59+
if (writer != null) writer.close();
60+
if (socket != null) socket.close();
61+
} catch (IOException e) {
62+
e.printStackTrace();
63+
Log.e(TAG, "onInterrupt: ", e);
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)