Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
StatInfo
Project
Project
Details
Activity
Releases
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
chenyuling
StatInfo
Commits
9dbc275a
Commit
9dbc275a
authored
Aug 03, 2023
by
chenyuling
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改弹窗
parent
a9b5d040
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
274 additions
and
21 deletions
+274
-21
vcs.xml
.idea/vcs.xml
+6
-0
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+12
-1
OkhttpInterruptDownImpl.java
.../srthinker/statinfo/download/OkhttpInterruptDownImpl.java
+1
-0
MainActivity.java
...rc/main/java/com/srthinker/statinfo/uis/MainActivity.java
+23
-9
Utils.java
...c/main/java/com/srthinker/statinfo/util/common/Utils.java
+223
-1
LoadDialog.java
...c/main/java/com/srthinker/statinfo/wedget/LoadDialog.java
+5
-10
file_paths.xml
app/src/main/res/xml/file_paths.xml
+4
-0
No files found.
.idea/vcs.xml
0 → 100644
View file @
9dbc275a
<?xml version="1.0" encoding="UTF-8"?>
<project
version=
"4"
>
<component
name=
"VcsDirectoryMappings"
>
<mapping
directory=
"$PROJECT_DIR$"
vcs=
"Git"
/>
</component>
</project>
\ No newline at end of file
app/src/main/AndroidManifest.xml
View file @
9dbc275a
...
...
@@ -9,6 +9,7 @@
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<!-- 安装APK权限,需要在程序中动态申请,并且不同于外部存储读写权限申请 -->
<uses-permission
android:name=
"android.permission.REQUEST_INSTALL_PACKAGES"
/>
<application
android:name=
".uis.MyApplication"
android:allowBackup=
"true"
...
...
@@ -29,7 +30,7 @@
<meta-data
android:name=
"design_height_in_dp"
android:value=
"540"
/>
<!-- fileprovider名称在安装时传递给系统安装程序 -->
<provider
<
!--<
provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
...
...
@@ -37,8 +38,18 @@
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/autoupdate" />
</provider>-->
<provider
android:name=
"androidx.core.content.FileProvider"
android:authorities=
"${applicationId}.fileProvider"
android:exported=
"false"
android:grantUriPermissions=
"true"
>
<meta-data
android:name=
"android.support.FILE_PROVIDER_PATHS"
android:resource=
"@xml/file_paths"
/>
</provider>
<activity
android:name=
".uis.MainActivity"
android:configChanges=
"keyboardHidden|orientation"
...
...
app/src/main/java/com/srthinker/statinfo/download/OkhttpInterruptDownImpl.java
View file @
9dbc275a
...
...
@@ -18,6 +18,7 @@ public class OkhttpInterruptDownImpl extends BaseDownloadImpl{
private
FileOutputStream
fos
;
private
InputStream
inputStream
;
private
Call
call
;
private
String
TAG
=
"OkhttpInterruptDownImpl"
;
public
static
OkhttpInterruptDownImpl
getInstance
(){
if
(
down
==
null
)
{
...
...
app/src/main/java/com/srthinker/statinfo/uis/MainActivity.java
View file @
9dbc275a
...
...
@@ -97,6 +97,7 @@ public class MainActivity extends BaseActivity implements OnTimeUpdateListener,
private
HashMap
<
Integer
,
Integer
>
groupEnterHashMap
=
null
;
private
HashMap
<
Integer
,
Integer
>
groupLeaveHashMap
=
null
;
private
HashMap
<
Integer
,
Integer
>
groupPresentHashMap
=
null
;
private
boolean
isPermission
;
@Override
...
...
@@ -139,7 +140,8 @@ public class MainActivity extends BaseActivity implements OnTimeUpdateListener,
updateTime
();
initGroup
();
initPeopleList
();
mLoadDialog
=
LoadDialog
.
getInstance
(
this
);
//mLoadDialog = LoadDialog.getInstance(this);
mLoadDialog
=
new
LoadDialog
(
this
);
//Log.i(TAG, "initView: deviceSn="+deviceSn+"V"+ Utils.getVersionName(this));
mBinding
.
tvDeviceDesc
.
setText
(
DEVICE_TYPE
+
" "
+
deviceSn
+
" V"
+
Utils
.
getVersionName
(
this
));
//getResp();
...
...
@@ -202,7 +204,7 @@ public class MainActivity extends BaseActivity implements OnTimeUpdateListener,
}
private
void
checkAllPermission
()
{
boolean
isPermission
=
PermissionUtil
.
checkMultiPermission
(
this
,
new
String
[]{
isPermission
=
PermissionUtil
.
checkMultiPermission
(
this
,
new
String
[]{
Manifest
.
permission
.
READ_EXTERNAL_STORAGE
,
Manifest
.
permission
.
WRITE_EXTERNAL_STORAGE
,
Manifest
.
permission
.
INTERNET
...
...
@@ -301,7 +303,9 @@ public class MainActivity extends BaseActivity implements OnTimeUpdateListener,
runOnUiThread
(()->{
//Log.i(TAG, "onProgress: progress="+progress);
String
desc
=
"下载更新中..."
+
progress
;
mLoadDialog
.
setContent
(
desc
);
if
(
mLoadDialog
!=
null
)
{
mLoadDialog
.
setContent
(
desc
);
}
});
}
...
...
@@ -310,16 +314,26 @@ public class MainActivity extends BaseActivity implements OnTimeUpdateListener,
if
(
downStatus
==
DOWN_START
){
runOnUiThread
(()->{
String
desc
=
"准备下载更新"
;
mLoadDialog
.
setContent
(
desc
);
mLoadDialog
.
show
();
if
(
mLoadDialog
!=
null
)
{
mLoadDialog
.
setContent
(
desc
);
mLoadDialog
.
show
();
}
});
}
else
if
(
downStatus
==
DOWN_FINISH
){
//安装更新
//Log.i(TAG, "onResult:进来多少次");
runOnUiThread
(()->{
mLoadDialog
.
dismiss
();
showTips
(
"更新版本,请进行安装"
);
Utils
.
installApp
(
getApplicationContext
(),
new
File
(
installPath
));
if
(
mLoadDialog
!=
null
)
{
mLoadDialog
.
dismiss
();
}
showTips
(
"更新版本,将进行安装"
);
boolean
restricted
=
Utils
.
isRootPermissionRestricted
();
if
(!
restricted
){
Utils
.
clientInstall
(
installPath
,
MainActivity
.
this
);
}
else
{
Utils
.
installApp
(
getApplicationContext
(),
new
File
(
installPath
));
}
});
...
...
@@ -489,7 +503,7 @@ public class MainActivity extends BaseActivity implements OnTimeUpdateListener,
@Override
public
void
onQueryStatus
(
String
desc
,
boolean
status
)
{
runOnUiThread
(()->{
if
(
status
==
false
){
if
(
!
status
){
showTips
(
desc
);
}
});
...
...
app/src/main/java/com/srthinker/statinfo/util/common/Utils.java
View file @
9dbc275a
...
...
@@ -8,15 +8,22 @@ import android.content.pm.PackageManager;
import
android.content.res.Configuration
;
import
android.net.Uri
;
import
android.os.Build
;
import
android.provider.Settings
;
import
android.util.DisplayMetrics
;
import
android.util.Log
;
import
android.view.WindowManager
;
import
android.widget.Toast
;
import
androidx.core.content.FileProvider
;
import
java.io.BufferedReader
;
import
java.io.DataOutputStream
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.InputStreamReader
;
import
java.net.MalformedURLException
;
import
java.net.URL
;
import
java.nio.charset.Charset
;
import
java.util.HashMap
;
import
java.util.Map
;
...
...
@@ -26,6 +33,8 @@ import me.jessyan.autosize.utils.ScreenUtils;
public
class
Utils
{
private
static
final
String
TAG
=
"Utils"
;
// 根据手机的分辨率从 dp 的单位 转成为 px(像素)
public
static
int
dip2px
(
Context
context
,
float
dpValue
)
{
// 获取当前手机的像素密度
...
...
@@ -83,16 +92,32 @@ public class Utils {
_Intent
.
setAction
(
Intent
.
ACTION_VIEW
);
Uri
_uri
;
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
N
)
{
_Intent
.
setFlags
(
Intent
.
FLAG_GRANT_READ_URI_PERMISSION
);
_Intent
.
setFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
_Intent
.
addFlags
(
Intent
.
FLAG_GRANT_READ_URI_PERMISSION
);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
_uri
=
FileProvider
.
getUriForFile
(
pContext
,
pContext
.
getPackageName
()
+
".fileProvider"
,
pFile
);
}
else
{
_uri
=
Uri
.
fromFile
(
pFile
);
_Intent
.
setFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
}
_Intent
.
setDataAndType
(
_uri
,
"application/vnd.android.package-archive"
);
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
O
)
{
boolean
hasInstallPermission
=
pContext
.
getPackageManager
().
canRequestPackageInstalls
();
if
(!
hasInstallPermission
)
{
// 请求安装未知应用来源的权限
startInstallPermissionSettingActivity
(
pContext
);
return
;
}
}
pContext
.
startActivity
(
_Intent
);
}
private
static
void
startInstallPermissionSettingActivity
(
Context
context
)
{
Uri
packageUri
=
Uri
.
parse
(
"package:"
+
context
.
getPackageName
());
Intent
intent
=
new
Intent
(
Settings
.
ACTION_MANAGE_UNKNOWN_APP_SOURCES
,
packageUri
);
intent
.
addFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
context
.
startActivity
(
intent
);
}
//弹出toast
public
static
void
showTips
(
Context
context
,
String
tips
){
Activity
activity
=
(
Activity
)
context
;
...
...
@@ -209,4 +234,201 @@ public class Utils {
}
//返回true表示用限制使用
public
static
boolean
isRootPermissionRestricted
()
{
boolean
isRestricted
=
false
;
Process
process
=
null
;
DataOutputStream
os
=
null
;
BufferedReader
reader
=
null
;
BufferedReader
reader1
=
null
;
try
{
process
=
Runtime
.
getRuntime
().
exec
(
"su"
);
os
=
new
DataOutputStream
(
process
.
getOutputStream
());
reader
=
new
BufferedReader
(
new
InputStreamReader
(
process
.
getErrorStream
()));
// 执行一个需要root权限的命令
os
.
writeBytes
(
"ls /data\n"
);
os
.
flush
();
os
.
writeBytes
(
"exit\n"
);
os
.
flush
();
process
.
waitFor
();
StringBuilder
output
=
new
StringBuilder
();
String
line
;
while
((
line
=
reader
.
readLine
())
!=
null
)
{
output
.
append
(
line
);
output
.
append
(
"\n"
);
}
Log
.
i
(
TAG
,
"isRootPermissionRestricted: output="
+
output
.
toString
());
// 检查返回结果是否包含权限被拒绝的提示
if
(
output
.
toString
().
contains
(
"not allowed"
))
{
isRestricted
=
true
;
}
reader1
=
new
BufferedReader
(
new
InputStreamReader
(
process
.
getInputStream
()));
StringBuilder
output1
=
new
StringBuilder
();
String
line1
;
while
((
line1
=
reader1
.
readLine
())
!=
null
)
{
output1
.
append
(
line1
);
output1
.
append
(
"\n"
);
}
// 检查返回结果是否包含权限被拒绝的提示
if
(
output1
.
toString
().
contains
(
"Permission denied"
))
{
isRestricted
=
true
;
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
finally
{
try
{
if
(
os
!=
null
)
{
os
.
close
();
}
if
(
reader
!=
null
)
{
reader
.
close
();
}
if
(
process
!=
null
)
{
process
.
destroy
();
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
return
isRestricted
;
}
//需要传下载后的apk的绝对路径和当前上下文,这个方法的返回值表示为:安装成功是true,安装失败是false
//apkPath:apk文件的绝对路径
public
static
boolean
clientInstall
(
String
apkPath
,
Context
context
)
{
boolean
result
=
false
;
DataOutputStream
dataOutputStream
=
null
;
BufferedReader
errorStream
=
null
;
BufferedReader
successStream
=
null
;
Process
process
=
null
;
try
{
// 申请 su 权限
process
=
Runtime
.
getRuntime
().
exec
(
"su"
);
dataOutputStream
=
new
DataOutputStream
(
process
.
getOutputStream
());
// 执行 pm install 命令 (这是apk安装命令)
String
command
=
"pm install -r "
+
apkPath
+
"\n"
;
//执行 am start -n 命令 (这是apk重启命令) -----.MainActivity是默认重启app后要打开哪个界面
String
runApp
=
"am start -n "
+
context
.
getPackageName
()+
"/"
+
context
.
getPackageName
()+
".MainActivity >>/dev/null 2>&1;"
;
//这样子写也是可以的,用\n结尾也可以
// String runApp = "am start -n "+context.getPackageName()+"/"+context.getPackageName()+".MainActivity"+ "\n";
command
=
command
+
runApp
;
Log
.
d
(
"111333"
,
"走到这里,---------------打印静默安装命令="
+
command
);
dataOutputStream
.
write
(
command
.
getBytes
(
Charset
.
forName
(
"UTF-8"
)));
dataOutputStream
.
writeBytes
(
"exit\n"
);
Log
.
d
(
"111333"
,
"走到这里,---------------打印静默安装完成"
);
dataOutputStream
.
flush
();
process
.
waitFor
();
errorStream
=
new
BufferedReader
(
new
InputStreamReader
(
process
.
getErrorStream
()));
StringBuilder
errorMsg
=
new
StringBuilder
();
String
line
;
while
((
line
=
errorStream
.
readLine
())
!=
null
)
{
errorMsg
.
append
(
line
);
}
Log
.
d
(
"111333"
,
"走到这里,---------------silent install error message:{}="
+
errorMsg
);
StringBuilder
successMsg
=
new
StringBuilder
();
successStream
=
new
BufferedReader
(
new
InputStreamReader
(
process
.
getInputStream
()));
// 读取命令执行结果
while
((
line
=
successStream
.
readLine
())
!=
null
)
{
successMsg
.
append
(
line
);
}
Log
.
d
(
"111333"
,
"走到这里,---------------silent install success message:{}="
+
successMsg
);
// 如果执行结果中包含 Failure 字样就认为是操作失败,否则就认为安装成功
if
(!(
errorMsg
.
toString
().
contains
(
"Failure"
)
||
successMsg
.
toString
().
contains
(
"Failure"
)))
{
result
=
true
;
}
}
catch
(
Exception
e
)
{
Log
.
d
(
"111333"
,
"走到这里,---------------e="
+
e
);
}
finally
{
try
{
if
(
process
!=
null
)
{
process
.
destroy
();
}
if
(
dataOutputStream
!=
null
)
{
dataOutputStream
.
close
();
}
if
(
errorStream
!=
null
)
{
errorStream
.
close
();
}
if
(
successStream
!=
null
)
{
successStream
.
close
();
}
}
catch
(
Exception
e
)
{
// ignored
}
}
return
result
;
}
/**
* Silent install
*
* @param path Package
* @return true: success false: failed
*/
public
static
boolean
installSilent
(
String
path
)
{
boolean
result
=
false
;
BufferedReader
es
=
null
;
DataOutputStream
os
=
null
;
try
{
Process
process
=
Runtime
.
getRuntime
().
exec
(
"su"
);
os
=
new
DataOutputStream
(
process
.
getOutputStream
());
String
command
=
"pm install -r "
+
path
+
"\n"
;
Log
.
i
(
TAG
,
"installSilent: command="
+
command
);
os
.
write
(
command
.
getBytes
(
Charset
.
forName
(
"utf-8"
)));
os
.
flush
();
os
.
writeBytes
(
"exit\n"
);
os
.
flush
();
process
.
waitFor
();
es
=
new
BufferedReader
(
new
InputStreamReader
(
process
.
getErrorStream
()));
String
line
;
StringBuilder
builder
=
new
StringBuilder
();
while
((
line
=
es
.
readLine
())
!=
null
)
{
builder
.
append
(
line
);
}
Log
.
d
(
TAG
,
"install msg is "
+
builder
.
toString
());
/* Installation is considered a Failure if the result contains
the Failure character, or a success if it is not.
*/
if
(!
builder
.
toString
().
contains
(
"Failure"
))
{
result
=
true
;
}
}
catch
(
Exception
e
)
{
Log
.
e
(
TAG
,
e
.
getMessage
(),
e
);
}
finally
{
try
{
if
(
os
!=
null
)
{
os
.
close
();
}
if
(
es
!=
null
)
{
es
.
close
();
}
}
catch
(
IOException
e
)
{
Log
.
e
(
TAG
,
e
.
getMessage
(),
e
);
}
}
return
result
;
}
}
app/src/main/java/com/srthinker/statinfo/wedget/LoadDialog.java
View file @
9dbc275a
...
...
@@ -27,14 +27,14 @@ public class LoadDialog extends Dialog {
initWindow
();
}
public
static
LoadDialog
getInstance
(
Context
context
){
/*
public static LoadDialog getInstance(Context context){
if (loadDialog == null) {
synchronized (LoadDialog.class){
loadDialog = new LoadDialog(context);
}
}
return loadDialog;
}
}
*/
private
void
initWindow
()
{
Window
window
=
getWindow
();
...
...
@@ -47,15 +47,10 @@ public class LoadDialog extends Dialog {
setCanceledOnTouchOutside
(
false
);
}
/*public void showDialog(){
show();
}
public void closeDialog(){
dismiss();
}*/
public
void
setContent
(
String
content
){
binding
.
tvLoadInfo
.
setText
(
content
);
}
}
app/src/main/res/xml/file_paths.xml
0 → 100644
View file @
9dbc275a
<?xml version="1.0" encoding="utf-8"?>
<paths
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<external-path
name=
"external_files"
path=
"."
/>
</paths>
\ 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