On Android I modified Termux API to call `displayManager.createVirtualDisplay` with `VIRTUAL_DISPLAY_FLAG_TRUSTED`, but `adb logcat` mentions:

```
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: java.lang.SecurityException: Requires ADD_TRUSTED_DISPLAY permission to create a trusted virtual display.
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.os.Parcel.createExceptionOrNull(Parcel.java:3340)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.os.Parcel.createException(Parcel.java:3324)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.os.Parcel.readException(Parcel.java:3307)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.os.Parcel.readException(Parcel.java:3249)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.hardware.display.IDisplayManager$Stub$Proxy.createVirtualDisplay(IDisplayManager.java:1603)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.hardware.display.DisplayManagerGlobal.createVirtualDisplay(DisplayManagerGlobal.java:893)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.hardware.display.DisplayManager.createVirtualDisplay(DisplayManager.java:1381)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.hardware.display.DisplayManager.createVirtualDisplay(DisplayManager.java:1341)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.hardware.display.DisplayManager.createVirtualDisplay(DisplayManager.java:1289)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.hardware.display.DisplayManager.createVirtualDisplay(DisplayManager.java:1228)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at com.termux.api.apis.AccessibilityAPI.onReceive(AccessibilityAPI.java:102)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at com.termux.api.TermuxApiReceiver.doWork(TermuxApiReceiver.java:90)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at com.termux.api.TermuxApiReceiver.onReceive(TermuxApiReceiver.java:67)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.app.ActivityThread.handleReceiver(ActivityThread.java:5029)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.app.ActivityThread.-$$Nest$mhandleReceiver(Unknown Source:0)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2577)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.os.Handler.dispatchMessage(Handler.java:110)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.os.Looper.loopOnce(Looper.java:248)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.os.Looper.loop(Looper.java:338)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.app.ActivityThread.main(ActivityThread.java:9067)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at java.lang.reflect.Method.invoke(Native Method)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: Caused by: android.os.RemoteException: Remote stack trace:
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at com.android.server.display.DisplayManagerService.createVirtualDisplayInternal(DisplayManagerService.java:1932)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at com.android.server.display.DisplayManagerService.-$$Nest$mcreateVirtualDisplayInternal(DisplayManagerService.java:0)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at com.android.server.display.DisplayManagerService$BinderService.createVirtualDisplay(DisplayManagerService.java:4957)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.hardware.display.IDisplayManager$Stub.onTransact(IDisplayManager.java:819)
04-05 03:11:24.610 15643 15643 E TermuxAPI.TermuxApiReceiver: at android.os.Binder.execTransactInternal(Binder.java:1421)
```

How can I give `ADD_TRUSTED_DISPLAY` permission?
Apr 11, 7:41pm

The error you're encountering is due to Android's security restrictions: ADD_TRUSTED_DISPLAY is a system-level permission that is not directly grantable to third-party apps (like Termux) via standard Android permission mechanisms. This permission is typically reserved for system apps or services with elevated privileges.


Why is this happening?

  • ADD_TRUSTED_DISPLAY is a system-only permission, meaning only apps signed with the platform key (i.e., built into the Android system) can use it.
  • The Android framework enforces this restriction to prevent unauthorized apps from creating trusted virtual displays, which could be used for sensitive operations (e.g., screen recording, input injection).

Possible Workarounds

1. Root Access (Not Recommended for Security Reasons)

  • If your device is rooted, you could use tools like su to run Termux as root and bypass the permission check.
  • Warning: This is not secure and can expose your device to malware.

2. Modify Android Framework (Advanced)

  • If you have the Android source code, you could modify the DisplayManagerService to allow your app to use the permission.
  • This requires compiling your own Android ROM, which is complex and not practical for most users.

3. Use ADB Shell (If Possible)

  • If you have ADB access, you could try running the command directly from a shell with root privileges:
    bash
    adb shell su -c "app_process -Djava.class.path=/path/to/your/app / com.termux.api.TermuxApiReceiver createVirtualDisplay ..."
  • This is still not guaranteed to work, as the permission check is enforced by the framework.

4. Request the Permission in Your App Manifest (Not Sufficient)

  • Even if you declare the permission in your AndroidManifest.xml, Android will still enforce the system-only restriction:
    xml
    <uses-permission android:name="android.permission.ADD_TRUSTED_DISPLAY" />
  • This will not grant the permission; it only declares your intent to use it.

5. Use a System App

  • If you can build your app as a system app (e.g., by flashing a custom ROM or using a rooted device), you can sign it with the platform key and use the permission.

Conclusion

There is no standard way to grant the ADD_TRUSTED_DISPLAY permission to a third-party app like Termux without rooting or modifying the Android framework. The restriction is intentional for security reasons.


If you are developing this for a specific use case (e.g., screen mirroring, accessibility), consider alternative approaches, such as using non-trusted virtual displays or leveraging other APIs (e.g., MediaProjection for screen capture).

Would you like help exploring alternative solutions for your specific use case?

Apr 11, 7:41pm

This is a shared conversation and may include unverified content that doesn't reflect Mistral AI's views. Login to resume chatting.