2

IUsbManager インターフェイス クラスにアクセスして service.grantDevicePermission() メソッドを呼び出し、ConfirmationActivity が常にユーザーに確認することなく USB デバイスのアクセス許可を自動的に設定する方法はありますか?

ありがとう

4

3 に答える 3

2

もちろんはい!あなたは私のために働いたこのコードを使用することができます:

public boolean grantAutomaticPermission(UsbDevice usbDevice)
 {
    try
    {
     Context context=YourActivityOrApplication;
     PackageManager pkgManager=context.getPackageManager();
     ApplicationInfo     appInfo=pkgManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);

     Class serviceManagerClass=Class.forName("android.os.ServiceManager");
     Method getServiceMethod=serviceManagerClass.getDeclaredMethod("getService",String.class);
     getServiceMethod.setAccessible(true);
     android.os.IBinder binder=(android.os.IBinder)getServiceMethod.invoke(null, Context.USB_SERVICE);

     Class iUsbManagerClass=Class.forName("android.hardware.usb.IUsbManager");
     Class stubClass=Class.forName("android.hardware.usb.IUsbManager$Stub");
     Method asInterfaceMethod=stubClass.getDeclaredMethod("asInterface", android.os.IBinder.class);
     asInterfaceMethod.setAccessible(true);
     Object iUsbManager=asInterfaceMethod.invoke(null, binder);


     System.out.println("UID : " + appInfo.uid + " " + appInfo.processName + " " + appInfo.permission);
     final Method grantDevicePermissionMethod = iUsbManagerClass.getDeclaredMethod("grantDevicePermission", UsbDevice.class,int.class);
     grantDevicePermissionMethod.setAccessible(true);
     grantDevicePermissionMethod.invoke(iUsbManager, usbDevice,appInfo.uid);


     System.out.println("Method OK : " + binder + "  " + iUsbManager);
     return true;
    }
    catch(Exception e)
    {
     System.err.println("Error trying to assing automatic usb permission : ");
     e.printStackTrace();
     return false;
    }
 }

私がしたことは、リフレクションを使用してアンドロイドがこれを行う方法を実装することです。このコードを使用するには、次のものが必要です。

<uses-permission android:name="android.permission.MANAGE_USB"/>

ただし、問題があります。正確にはわかりません。間違っている場合は修正してください。アプリケーションではなく、ユーザーが権限を保持しているため、アプリケーションダッシュボードからアプリケーションを起動しようとすると失敗します。Android がアプリケーションを開始することを確認する必要があります。たとえば、ランチャーとして設定し、HOME インテントで開始できるようにします。

ご挨拶、期待して誰かを助けることができます。

于 2014-05-19T16:58:13.660 に答える
2

はい、できます。

@CristhianBによって投稿されたコードを取得すると、それを実行できますが、それは非常に困難ですが、次のいずれかで動作させる必要があります。

  1. アプリを priv-app フォルダーに移動し、システム アプリとして実行する権限を設定します。(userId とユーザー グループを使用)
  2. @CristhianBが行ったのと同じことを行います(アプリをシステムサービスとして実行するように設定します。これは、実際にはランチャーとして実行するように設定されています.
  3. キーで Os に再署名し、アプリ マニフェスト android:protectionLevel="signatureOrSystem" でアクセス許可プロパティを設定すると、ゴールデン !!

3 番目の方法では、アプリはシステム キーと同じキーで署名されるため、アプリは何でも実行できます。これは、システム アプリとして実行していることを意味しますが、アプリを priv-app フォルダーにインストールする必要はありません。

この件に関してご質問がございましたら、喜んでお手伝いさせていただきます。同じことを実装したばかりで、完了するまでに 3 週間かかりましたので、多くの時間を節約できます。:-)

于 2015-11-05T22:10:44.527 に答える
-1

もちろん違います。それは、そもそもパーミッションを持つという全体のポイントを無効にします。ただし、ユーザーは常に特定の接続を許可するように選択できます。

于 2012-11-30T16:02:51.587 に答える