update docs about Shizuku

fix #10
This commit is contained in:
BinTianqi
2024-04-24 13:23:19 +08:00
parent e78b9809ee
commit 99c7077fd6
6 changed files with 40 additions and 34 deletions

View File

@@ -158,22 +158,14 @@ dpm remove-active-admin com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver
请自己学习如何启动[Shizuku](https://github.com/RikkaApps/Shizuku) 请自己学习如何启动[Shizuku](https://github.com/RikkaApps/Shizuku)
如果Shizuku正在运行但是OwnDroid无法申请权限请关闭Shizuku和OwnDroid的电池优化这种情况在非原生系统中比较常见
功能: 功能:
- 激活Device admin - 激活[Device admin](#device-admin)
- 激活Profile owner - 激活[Profile owner](#profile-owner)
- 激活Device admin - 激活[Device owner](#device-owner)
- 激活[由组织拥有的工作资料](#由组织拥有的工作资料) - 激活[由组织拥有的工作资料](#由组织拥有的工作资料)
- 列出所有Device owner和Profile owner - 列出所有Device owner和Profile owner
Shizuku的本质是ADB。在安卓10或以下你还是要连接电脑激活Shizuku
不能在非主用户中使用
因为作者懒得研究Shizuku-API所以OwnDroid没有添加任何Shizuku相关依赖。以上功能均是通过rish实现。因为是套壳的rish所以不支持Sui
### 设备唯一标识码 ### 设备唯一标识码
需API31或以上 需API31或以上

View File

@@ -45,7 +45,9 @@ import com.bintianqi.owndroid.ui.Animations
import com.bintianqi.owndroid.ui.theme.OwnDroidTheme import com.bintianqi.owndroid.ui.theme.OwnDroidTheme
import com.bintianqi.owndroid.ui.theme.SetDarkTheme import com.bintianqi.owndroid.ui.theme.SetDarkTheme
import com.bintianqi.owndroid.ui.theme.bgColor import com.bintianqi.owndroid.ui.theme.bgColor
import kotlinx.coroutines.delay
var backToHome = false
lateinit var displayMetrics: DisplayMetrics lateinit var displayMetrics: DisplayMetrics
@ExperimentalMaterial3Api @ExperimentalMaterial3Api
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
@@ -86,6 +88,12 @@ fun MyScaffold(){
val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE) val sharedPref = LocalContext.current.getSharedPreferences("data", Context.MODE_PRIVATE)
val focusMgr = LocalFocusManager.current val focusMgr = LocalFocusManager.current
SetDarkTheme() SetDarkTheme()
LaunchedEffect(Unit){
while(true){
if(backToHome){ navCtrl.navigateUp(); backToHome=false }
delay(200)
}
}
NavHost( NavHost(
navController = navCtrl, navController = navCtrl,
startDestination = "HomePage", startDestination = "HomePage",
@@ -128,12 +136,13 @@ private fun HomePage(navCtrl:NavHostController){
val myContext = LocalContext.current val myContext = LocalContext.current
val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager val myDpm = myContext.getSystemService(ComponentActivity.DEVICE_POLICY_SERVICE) as DevicePolicyManager
val myComponent = ComponentName(myContext,Receiver::class.java) val myComponent = ComponentName(myContext,Receiver::class.java)
val activateType = val activateType = stringResource(
if(isDeviceOwner(myDpm)){"Device Owner"} if(isDeviceOwner(myDpm)){R.string.device_owner}
else if(isProfileOwner(myDpm)){ else if(isProfileOwner(myDpm)){
stringResource(if(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)){R.string.work_profile_owner}else{R.string.profile_owner}) if(VERSION.SDK_INT>=24&&myDpm.isManagedProfile(myComponent)){R.string.work_profile_owner}else{R.string.profile_owner}
} }
else if(myDpm.isAdminActive(myComponent)){"Device Admin"}else{""} else if(myDpm.isAdminActive(myComponent)){R.string.device_admin}else{R.string.click_to_activate}
)
Column(modifier = Modifier.statusBarsPadding().verticalScroll(rememberScrollState())) { Column(modifier = Modifier.statusBarsPadding().verticalScroll(rememberScrollState())) {
Spacer(Modifier.padding(vertical = 25.dp)) Spacer(Modifier.padding(vertical = 25.dp))
Text(text = stringResource(R.string.app_name), style = typography.headlineLarge, modifier = Modifier.padding(start = 10.dp), color = colorScheme.onBackground) Text(text = stringResource(R.string.app_name), style = typography.headlineLarge, modifier = Modifier.padding(start = 10.dp), color = colorScheme.onBackground)
@@ -144,7 +153,7 @@ private fun HomePage(navCtrl:NavHostController){
.padding(vertical = 8.dp, horizontal = 8.dp) .padding(vertical = 8.dp, horizontal = 8.dp)
.clip(RoundedCornerShape(15)) .clip(RoundedCornerShape(15))
.background(color = colorScheme.primary) .background(color = colorScheme.primary)
.clickable(onClick = { navCtrl.navigate("Permissions") }) .clickable(onClick = {navCtrl.navigate("Permissions")})
.padding(vertical = 16.dp), .padding(vertical = 16.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
@@ -162,7 +171,7 @@ private fun HomePage(navCtrl:NavHostController){
color = colorScheme.onPrimary, color = colorScheme.onPrimary,
modifier = Modifier.padding(bottom = 2.dp) modifier = Modifier.padding(bottom = 2.dp)
) )
if(activateType!=""){ Text(text = activateType, color = colorScheme.onPrimary, modifier = Modifier.padding(start = 2.dp)) } if(activateType!=""){ Text(text = activateType, color = colorScheme.onPrimary) }
} }
} }
HomePageItem(R.string.system_manage, R.drawable.mobile_phone_fill0, "SystemManage", navCtrl) HomePageItem(R.string.system_manage, R.drawable.mobile_phone_fill0, "SystemManage", navCtrl)
@@ -192,7 +201,7 @@ fun HomePageItem(name:Int, imgVector:Int, navTo:String, myNav:NavHostController)
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.clip(RoundedCornerShape(25)) .clip(RoundedCornerShape(25))
.clickable(onClick = { myNav.navigate(navTo) }) .clickable(onClick = {myNav.navigate(navTo)})
.padding(vertical = 13.dp), .padding(vertical = 13.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {

View File

@@ -35,6 +35,7 @@ import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.bintianqi.owndroid.R import com.bintianqi.owndroid.R
import com.bintianqi.owndroid.Receiver import com.bintianqi.owndroid.Receiver
import com.bintianqi.owndroid.backToHome
import com.bintianqi.owndroid.ui.* import com.bintianqi.owndroid.ui.*
import com.bintianqi.owndroid.ui.theme.bgColor import com.bintianqi.owndroid.ui.theme.bgColor
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@@ -231,8 +232,12 @@ private fun ProfileOwner(){
Text(stringResource(if(isProfileOwner(myDpm)){R.string.activated}else{R.string.deactivated}), style = typography.titleLarge) Text(stringResource(if(isProfileOwner(myDpm)){R.string.activated}else{R.string.deactivated}), style = typography.titleLarge)
Spacer(Modifier.padding(vertical = 5.dp)) Spacer(Modifier.padding(vertical = 5.dp))
if(isProfileOwner(myDpm)&&VERSION.SDK_INT>=24){ if(isProfileOwner(myDpm)&&VERSION.SDK_INT>=24){
val co = rememberCoroutineScope()
Button( Button(
onClick = {myDpm.clearProfileOwner(myComponent)}, onClick = {
myDpm.clearProfileOwner(myComponent)
co.launch { delay(600); if(!isProfileOwner(myDpm)){ backToHome=true } }
},
colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError) colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError)
) { ) {
Text(stringResource(R.string.deactivate)) Text(stringResource(R.string.deactivate))
@@ -261,7 +266,7 @@ private fun DeviceOwner(navCtrl: NavHostController){
Button( Button(
onClick = { onClick = {
myDpm.clearDeviceOwnerApp(myContext.packageName) myDpm.clearDeviceOwnerApp(myContext.packageName)
co.launch{ delay(600); if(!isDeviceOwner(myDpm)){navCtrl.navigateUp()} } co.launch{ delay(600); if(!isDeviceOwner(myDpm)){ backToHome=true } }
}, },
colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError) colors = ButtonDefaults.buttonColors(containerColor = colorScheme.error, contentColor = colorScheme.onError)
) { ) {
@@ -308,7 +313,7 @@ fun DeviceInfo(){
) )
if(VERSION.SDK_INT>=23){ encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY] = stringResource(R.string.es_active_default_key) } if(VERSION.SDK_INT>=23){ encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY] = stringResource(R.string.es_active_default_key) }
if(VERSION.SDK_INT>=24){ encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER] = stringResource(R.string.es_active_per_user) } if(VERSION.SDK_INT>=24){ encryptionStatus[DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER] = stringResource(R.string.es_active_per_user) }
Text("加密状态:${encryptionStatus[myDpm.storageEncryptionStatus]}") Text(stringResource(R.string.encrypt_status_is)+encryptionStatus[myDpm.storageEncryptionStatus])
Spacer(Modifier.padding(vertical = 2.dp)) Spacer(Modifier.padding(vertical = 2.dp))
val adminList = myDpm.activeAdmins val adminList = myDpm.activeAdmins
if(adminList!=null){ if(adminList!=null){

View File

@@ -8,7 +8,6 @@ import android.content.pm.PackageManager
import android.os.Binder import android.os.Binder
import android.os.Build.VERSION import android.os.Build.VERSION
import android.os.IBinder import android.os.IBinder
import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
@@ -38,6 +37,8 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import rikka.shizuku.Shizuku import rikka.shizuku.Shizuku
private var waitGrantPermission = false
@Composable @Composable
fun ShizukuActivate(){ fun ShizukuActivate(){
val myContext = LocalContext.current val myContext = LocalContext.current
@@ -202,11 +203,14 @@ private fun checkPermission(context: Context):String{
fun checkShizukuStatus():Int{ fun checkShizukuStatus():Int{
val status = try { val status = try {
if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { 1 } if(Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { waitGrantPermission = false; 1 }
else if (Shizuku.shouldShowRequestPermissionRationale()) { 0 } else if(Shizuku.shouldShowRequestPermissionRationale()) { 0 }
else { Shizuku.requestPermission(0); 0 } else{
if(!waitGrantPermission){Shizuku.requestPermission(0)}
waitGrantPermission = true
0
}
}catch(e:Exception){ -1 } }catch(e:Exception){ -1 }
Log.e("Shizuku",status.toString())
return status return status
} }

View File

@@ -37,13 +37,13 @@
<string name="decide_by_user">由用户决定</string> <string name="decide_by_user">由用户决定</string>
<string name="unsupported">不支持</string> <string name="unsupported">不支持</string>
<string name="developing">功能开发中</string> <string name="developing">功能开发中</string>
<string name="try_again">请再试一次</string>
<string name="unknown_effect">效果未知</string> <string name="unknown_effect">效果未知</string>
<string name="options">选项</string> <string name="options">选项</string>
<string name="copy_command">复制代码</string> <string name="copy_command">复制代码</string>
<string name="unknown_status">未知状态</string> <string name="unknown_status">未知状态</string>
<!--Permissions--> <!--Permissions-->
<string name="click_to_activate">点击以激活</string>
<string name="device_admin">Device admin</string> <string name="device_admin">Device admin</string>
<string name="profile_owner">Profile owner</string> <string name="profile_owner">Profile owner</string>
<string name="device_owner">Device owner</string> <string name="device_owner">Device owner</string>
@@ -75,9 +75,7 @@
<string name="activate_device_admin_here">在这里激活Device admin</string> <string name="activate_device_admin_here">在这里激活Device admin</string>
<!--Shizuku--> <!--Shizuku-->
<string name="not_primary_user_not_support_shizuku">暂不支持在非主用户中使用Shizuku</string>
<string name="check_shizuku">检查Shizuku</string> <string name="check_shizuku">检查Shizuku</string>
<string name="input_userid_of_work_profile">请输入工作资料的UserID</string>
<string name="list_owners">列出Owners</string> <string name="list_owners">列出Owners</string>
<string name="shizuku_not_started">服务未启动</string> <string name="shizuku_not_started">服务未启动</string>
<string name="shizuku_activated_shell">已授权Shell</string> <string name="shizuku_activated_shell">已授权Shell</string>
@@ -89,7 +87,6 @@
<string name="shizuku_not_bind">Shizuku未连接</string> <string name="shizuku_not_bind">Shizuku未连接</string>
<string name="invalid_binder">无效Binder</string> <string name="invalid_binder">无效Binder</string>
<string name="bind_shizuku">连接Shizuku</string> <string name="bind_shizuku">连接Shizuku</string>
<string name="shizuku_permission_denied">未授权</string>
<!--System--> <!--System-->
<string name="system_manage">系统</string> <string name="system_manage">系统</string>
@@ -149,6 +146,7 @@
<string name="wipe_silently">静默清除</string> <string name="wipe_silently">静默清除</string>
<string name="will_delete_work_profile">将会删除工作资料</string> <string name="will_delete_work_profile">将会删除工作资料</string>
<string name="api34_or_above_wipedata_cannot_in_system_user">API34或以上将不能在系统用户中使用WipeData</string> <string name="api34_or_above_wipedata_cannot_in_system_user">API34或以上将不能在系统用户中使用WipeData</string>
<string name="encrypt_status_is">加密状态:</string>
<!--SystemUpdatePolicy--> <!--SystemUpdatePolicy-->
<string name="is_security_patch">安全补丁: %1$s</string> <string name="is_security_patch">安全补丁: %1$s</string>

View File

@@ -38,7 +38,6 @@
<string name="decide_by_user">Decide by user</string> <string name="decide_by_user">Decide by user</string>
<string name="unsupported">Unsupported</string> <string name="unsupported">Unsupported</string>
<string name="developing">Developing</string> <string name="developing">Developing</string>
<string name="try_again">Try again</string>
<string name="unknown_effect">Unknown effect</string> <string name="unknown_effect">Unknown effect</string>
<string name="options">Options</string> <string name="options">Options</string>
<string name="copy_command">Copy Command</string> <string name="copy_command">Copy Command</string>
@@ -47,6 +46,7 @@
<string name="unknown_status">Unknown status</string> <string name="unknown_status">Unknown status</string>
<!--Permissions--> <!--Permissions-->
<string name="click_to_activate">Click to activate</string>
<string name="device_admin">Device admin</string> <string name="device_admin">Device admin</string>
<string name="profile_owner">Profile owner</string> <string name="profile_owner">Profile owner</string>
<string name="device_owner">Device owner</string> <string name="device_owner">Device owner</string>
@@ -83,9 +83,7 @@
<!--Shizuku--> <!--Shizuku-->
<string name="shizuku" translatable="false">Shizuku</string> <string name="shizuku" translatable="false">Shizuku</string>
<string name="not_primary_user_not_support_shizuku">You can only use this feature in the primary user. </string>
<string name="check_shizuku">Check permission</string> <string name="check_shizuku">Check permission</string>
<string name="input_userid_of_work_profile">Enter UserID of work profile</string>
<string name="list_owners">List owners</string> <string name="list_owners">List owners</string>
<string name="shizuku_not_started">Shizuku not started. </string> <string name="shizuku_not_started">Shizuku not started. </string>
<string name="dpm_activate_do_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string> <string name="dpm_activate_do_command" translatable="false">dpm set-device-owner com.bintianqi.owndroid/com.bintianqi.owndroid.Receiver</string>
@@ -100,7 +98,6 @@
<string name="invalid_binder">Invalid binder</string> <string name="invalid_binder">Invalid binder</string>
<string name="bind_shizuku">Connect Shizuku</string> <string name="bind_shizuku">Connect Shizuku</string>
<string name="shizuku_not_bind">Shizuku disconnected</string> <string name="shizuku_not_bind">Shizuku disconnected</string>
<string name="shizuku_permission_denied">Permission denied</string>
<!--System--> <!--System-->
<string name="system_manage">System manager</string> <string name="system_manage">System manager</string>
@@ -159,6 +156,7 @@
<string name="wipe_silently">Wipe silently</string> <string name="wipe_silently">Wipe silently</string>
<string name="will_delete_work_profile">Work profile will be deleted. </string> <string name="will_delete_work_profile">Work profile will be deleted. </string>
<string name="api34_or_above_wipedata_cannot_in_system_user">You cannot use WipeData in system user. </string> <string name="api34_or_above_wipedata_cannot_in_system_user">You cannot use WipeData in system user. </string>
<string name="encrypt_status_is">Encrypt status: </string>
<!--SystemUpdatePolicy--> <!--SystemUpdatePolicy-->
<string name="is_security_patch">Security patch: %1$s</string> <string name="is_security_patch">Security patch: %1$s</string>