7

AndroidのUSB Host API経由でデバイスとの通信許可を取得できました。

private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";

protected void execute(Context ctxt) {
    UsbManager manager = (UsbManager) viewer.getSystemService(Context.USB_SERVICE);
    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();

    UsbDevice d = null;
    for (String s : deviceList.keySet()) {
        d = deviceList.get(s);
    }

    PendingIntent mPermissionIntent = PendingIntent.getBroadcast(ctxt, 0, new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    viewer.registerReceiver(mUsbReceiver, filter);

    manager.requestPermission(d, mPermissionIntent);
}

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if(device != null){
                      Log.d(TAG, "Permission granted!");
                   }
                } 
                else {
                    Log.d(TAG, "permission denied for device " + device);
                }
            }
        }
    }
};

残念ながら、これは NDK コードにこのデバイスと直接通信する許可を与えません (これは libusb に必要です)。ルートなしで Java から NDK にアクセス許可を「転送」する方法はありますか?

PS 私は UNIX ソケットを使用して、元の File Decirptor を Java から Android ネイティブ実行可能ファイルに転送することになりました ( https://github.com/martinmarinov/rtl_tcp_andro-でプロジェクトを GNU で編集しました)。一部の人々にとっては、NDK を使用して (サードパーティのアプリではなく) デバイスに直接接続している可能性があるため、さらに簡単になり、Java で使用するポインターは、UNIX をいじる必要なく NDK からアクセスできる場合があります。ソケット。

4

1 に答える 1

2

Android セキュリティ モデルでは、各アプリケーションが必要なアクセス許可を静的に宣言し、ユーザーがインストール時にアクセス許可セットを承認する必要があるため、アクセス許可の「転送」は不可能です。動的権限はサポートされていません。各アプリは、マニフェストで静的に宣言されたアクセス許可を使用して、単一の UID にマップされます。Java はアクセス許可の境界ではなく、Dalvik VM は NDK を介してネイティブ コードを実行することを妨げるものではありません。すべての権限がマニフェストにリストされている必要があり、apk には Java (dex) コードがまったく含まれていない場合があります。

http://developer.android.com/guide/topics/security/permissions.html

http://osdir.com/ml/android-ndk/2012-09/msg00094.html

于 2012-12-23T07:18:10.337 に答える