17

(Androidアプリケーションを使用して)Androidデバイスをホストにプログラムで接続および切断する方法を見つける必要があります。

GalaxyNexusを使用しています。私の目標は、すべてを可能な限り在庫に近づけることですが、カーネルで詳細なデバッグメッセージをすでに有効にしており、それらを表示するために、電話でのルートアクセス/proc/kmsg(およびシェルコマンドdmesg)を有効にしています。

ルートアクセスを利用して必要なことを実行する方法があると確信していますが、すべての試みがnixにつながりました。

  • 手を出す/proc/bus/usb
  • 手を出す/dev/bus/usb
  • MTP / PTP間の変更(プログラムで実行できない)
  • AndroidUSBガジェットドライバーをモジュールにする<-???

リストの最後のオブジェクトを実行する方法を理解しようとしています。そうするとrmmodinsmodアプリケーション*.koが作成され、電話が接続および切断されます。ただし、このオプションの実現可能性についてはわかりません。

4

4 に答える 4

1

締め切りが近づくと解決策が出てきたので、それが最善の方法ではないとほぼ確信していますが、それは私の要件を満たしていました。

Moddedカーネルを構築する(特定の機能をフックできるようにするため)

  • Kprobesをサポートするようにカーネル構成を変更します(CONFIG_KPROBESをYに設定します)
  • android_setup()定義から「static」キーワードを削除します(driver / usb / gadget / android.c)
  • そのカーネルを構築する

カーネルモジュールを構築します(接続と切断の実際の機能を提供します)

  • Kallsymsを使用して、android_setup()の絶対アドレスを動的にプルします
  • kprobesを使用して、android_setup()をフックします
  • android_setup()が呼び出されるたびに実行する2つのタイマーを設定します
  • 最初のタイマーは今から2秒に設定され、2番目のタイマーは今から2.005秒に設定されます
  • 両方のタイマーは、データとして構造体usb_gadgetへのポインターを取ります
  • それぞれのコールバック関数で、usb_gadget_connect()およびusb_gadget_disconnect()を呼び出します。これにより、SamsungGalaxyNexusで物理的な切断とその後の再接続が強制されます。

アプリケーションのビルド

  • お奨めは根ざしたデバイスを持っています
  • SU権限(「insmodmodule_name」)を使用してシェル呼び出しを行うだけです。rmmodを呼び出すまで、モジュールはデバイスを強制的に列挙サイクルにし、切断と再接続を継続的に行います。

これらの結果を繰り返すことに興味がある場合は、ここに投稿されたドキュメントを読んで、質問があれば遠慮なく送ってください。

https://docs.google.com/uc?export=download&id=0B9WchRkSOWwJbi10MGhLWUljT2s

于 2014-02-13T23:56:27.693 に答える
0

Settings.Secure.USB_MASS_STORAGE_ENABLEDまたはのようないくつかの保護された設定を有効/無効にしようとすることができますSettings.Secure.ADB_ENABLED(あなたが「接続」と呼ぶものに応じて!)

このコードは機能するはずです(USBマスストレージを無効にする):

Settings.Secure.putInt(getContentResolver(),Settings.Secure.USB_MASS_STORAGE_ENABLED, 0);

于 2013-04-03T10:42:50.850 に答える
0

Settings.Secure.putInt(getContentResolver()、Settings.Secure.USB_MASS_STORAGE_ENABLED、0);

于 2013-04-23T05:26:31.737 に答える
0

InternetControl.java

public class InternetControl {
    public static void EnableInternet(Context context)
    {
        try {
            Log.i("Reached Enable", "I am here");
            setMobileDataEnabled(context,true);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } 
    }

    public static void DisableInternet(Context context)
    {
        try {
            Log.i("Reached Disable", "I am here");
            setMobileDataEnabled(context,false);
        } catch (Exception e) {
    System.out.println(e.getMessage());
        } 
    }

    private static void setMobileDataEnabled(Context context , boolean enabled) throws Exception{
           final ConnectivityManager conn = (ConnectivityManager)  context.getSystemService(Context.CONNECTIVITY_SERVICE);
           final Class connClass = Class.forName(conman.getClass().getName());
           final Field iConnectivityManagerField = connClass.getDeclaredField("mService");
           iConnectivityManagerField.setAccessible(true);
           final Object iConnectivityManager = iConnectivityManagerField.get(conn);
           final Class iConnectivityManagerClass =  Class.forName(iConnectivityManager.getClass().getName());
           final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
           setMobileDataEnabledMethod.setAccessible(true);
           setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
        }

}

Manifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET" />

有効化または無効化機能は静的であるため、を使用して呼び出すことができます
classname.functionname();

于 2014-01-08T15:43:29.897 に答える