Я пытаюсь выполнить следующую команду:
Process process = Runtime.getRuntime().exec("adb shell dpm set-device-owner com.example.package/.DeviceAdmin", null,null);
и получили следующее исключение
W/System.err:java.io.IOException: Cannot run program "adb": error=13, Permission denied
W/System.err: at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
W/System.err: at java.lang.Runtime.exec(Runtime.java:692)
W/System.err: at java.lang.Runtime.exec(Runtime.java:525)
Я пытаюсь установить свое устройство в качестве владельца, программно выполнив «adb shell dpm set-device-owner com.example.package/.DeviceAdmin».
Я имел в виду следующие ссылки SO, однако я не могу избавиться от этой ошибки.
https://stackoverflow.com/a/27909315/5521089
https://stackoverflow.com/a/44164984/5521089
ПРИМЕЧАНИЕ. Я пытался запустить команду без префикса оболочки adb, однако она возвращала значение null и не применяла никаких изменений.
Следующий код выполняет мою команду.
try {
StringBuffer output = new StringBuffer();
Process process = Runtime.getRuntime().exec("dpm set-device-owner com.example.package/.DeviceAdmin", null,null);
process.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
output.append(line + "n");
Log.d("OUTPUT = ", output.toString());
}
} catch (Exception e) {
Log.e("LOGINACTIVITY ", "device owner not set");
Log.e("LOGINACTIVITY ", e.toString());
e.printStackTrace();
}
Ниже мой подкласс DeviceAdminReceiver
public class DeviceAdmin extends DeviceAdminReceiver {
public ComponentName getComponentName(Context context){
return new ComponentName(context.getApplicationContext(), DeviceAdmin.class);
}
void showToast(Context context, String msg) {
String status = msg;
Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
}
@Override
public void onEnabled(Context context, Intent intent) {
showToast(context, "Enabled");
}
@Override
public void onDisabled(Context context, Intent intent) {
showToast(context,"Disabled");
}
}
Мой манифест, регистрирующий мой приемник
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".DeviceAdmin"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/policies"/>
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
</intent-filter>
</receiver>
</application>
Проверены настройки и устройство не имеет учетных записей (это устройство Android без каких-либо сервисов Google Play и не имеет root-прав). Приложение имеет minSdkVersion 21/targetSdkVersion 27.
В конечном счете, я хочу установить устройство в качестве владельца (без NFC) с единственной целью — закрепить экран, не спрашивая разрешения пользователя (это POS-приложение). Как я могу выполнить команду, чтобы установить устройство в качестве владельца без каких-либо исключений?