我目前能够在使用SuperSU的root设备上的应用程序中获得root访问权限.当我的应用程序请求root访问权限时,会显示来自SuperSu的对话框,然后用户单击"授予"以允许权限.
我希望能够绕过这一步,让我的应用程序获得root策略的root权限,而无需单击SuperSu对话框上的"Grant"按钮.
我该怎么做?
我希望能够绕过这一步,让我的应用程序以编程方式获得root权限,而无需单击SuperSu对话框上的"Grant"按钮.
你不能.用户必须授予您的应用root访问权限.除非您构建自己的SU管理应用程序,否则无法绕过此初始权限请求.
我正在提供应用程序的设备,然后用户使用该设备(我拥有).只是为了提供更多上下文,当我发布设备时,它已经拥有了应用程序,并且已经被SuperSu授予root访问权限.因此,我试图避免的情况是,应用程序可能会松开权限,然后在现场进行再次请求.用户不懂技术,他们不知道SuperSu对话框是什么或者用它做什么.
如果您拥有该设备,则可以在SuperSu设置中将"默认访问权限"更改为"授予".您还可以基于每个应用程序更改此设置.
您在评论中提到您的应用已拥有超级用户权限.您具有root访问权限,因此您可以更改SuperSu的共享首选项以始终授予您的应用访问权限.同样,您暗示您拥有该设备,因此您不需要以编程方式修改SuperSu首选项.
如果您确实需要修改SuperSu的首选项,则以下代码应将应用程序的访问设置更改为始终允许和禁用通知(使用android-shell):
@WorkerThread
public static boolean tryChangingSuperSuDefaultAccess(Context context) throws Exception {
String packageName = context.getPackageName();
PackageManager pm = context.getPackageManager();
// Get the preferences for SuperSu
Context packageContext = context.createPackageContext("eu.chainfire.supersu", 0);
SharedPreferences superSuPrefs = PreferenceManager.getDefaultSharedPreferences(packageContext);
File superSuPrefsFile = getSharedPreferencesFile(superSuPrefs);
// Copy SuperSu preferences to our app's shared_prefs directory
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
File directory = getSharedPreferencesFile(preferences).getParentFile();
File destination = new File(directory, "eu.chainfire.supersu.xml");
int uid = pm.getApplicationInfo(context.getPackageName(), 0).uid;
destination.getParentFile().mkdirs();
Shell.SU.run("cp \"" + superSuPrefsFile + "\" \"" + destination + "\"");
Shell.SU.run("chmod 0660 \"" + destination + "\"");
Shell.SU.run("chown " + uid + " " + uid + " \"" + destination + "\"");
// Now we can edit the shared preferences
superSuPrefs = context.getSharedPreferences("eu.chainfire.supersu", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = superSuPrefs.edit();
editor.putString(String.format("config_%s_notify", packageName), "no"); // disable SuperSu notifications
editor.putString(String.format("config_%s_access", packageName), "grant"); // Set access to grant for this app
// noinspection all
editor.commit();
// Copy the edited shared preferences back
return Shell.SU.run("cp \"" + destination + "\" \"" + superSuPrefsFile + "\"").isSuccessful();
}
private static File getSharedPreferencesFile(SharedPreferences preferences)
throws NoSuchFieldException, IllegalAccessException {
Field field = preferences.getClass().getDeclaredField("mFile");
if (!field.isAccessible()) field.setAccessible(true);
return (File) field.get(preferences);
}
Run Code Online (Sandbox Code Playgroud)
我不建议使用上面的代码.您应该透明并教育您的用户.如果您拥有该设备(如声明的那样),则可以使用该应用自行更改这些设置.
| 归档时间: |
|
| 查看次数: |
3409 次 |
| 最近记录: |