1

私は Android で作業しており、JNI コードを書いています。デバイスからモバイル機器識別子 (MEID) を照会する方法を探しています。

http://en.wikipedia.org/wiki/Mobile_equipment_identifier

Android デバイスで単独で実行できる C または C++ コードを作成しようとしているので、Java を使用できないと思います (つまり、MEID を から取得しますTelephonyManager)。

StackOverflow を検索すると、デバイスの IMEI/MEID を取得するために使用できる Android シェルまたは adb コマンドはありますか?

わかりましdumpsys iphonesubinfoた。必要な情報を取得できます。そしてそれはうまくいきます!

dumpsysAndroid のソースの一部として以外のソースは見つかりませんでした。ということでダウンロードしてみました... ダウンロードが完了する前にハードディスクがいっぱいになってしまいましたが、ソースコードはdumpsys. 驚くほど短い C++ ファイルです。Android のIBinderインターフェースを照会するだけです。

だから、私の質問:

IBinder0) NDK のものだけを使用してクエリを作成する方法はありますか? によって使用されるインクルード ファイルdumpsys.cppは NDK にはなく、NDK ディレクトリにはインクルード ファイルやコード サンプルがgrep見つからないため、私の推測では「いいえ」です (ただし、間違っていると思います)。IBinder

1) MEID を取得する他の良い方法はありますか?

system("dumpsys iphonesubinfo > /tmp/myprogname_dumpsys.tmp"結果のファイルを使用してから開き、解析する必要があると真剣に考えています。それはうまくいくはずですが、私はそれをエレガントとは言いません...そしてdumpsys、すべてのAndroidデバイスで利用できるかどうかはわかりません.

編集: を使用system()して実行dumpsysするというアイデアは機能しません。これは、dumpsysニーズandroid.permission.DUMPと Android がシステム以外のアプリにその許可を与えることを許可しなくなったためです。

JavaでのDumpsys権限拒否

4

2 に答える 2

1

Dalvik は JVM と同じ JNI インターフェースをすべて実装していると思います。そのため、少し面倒ですが、ネイティブ コードから JNI を介して任意の Java クラスやメソッドを呼び出すことは完全に可能です。

/* assuming you already have */
JNIEnv *env;
jobject context;
/* then call (with error-checking) */
jclass cls = (*env)->FindClass(env, "android/context/Context");
jmethodId mid = (*env)->GetMethodID(env, context_cls, "getSystemService",
    "(Ljava/lang/String;)Ljava/lang/Object;");
jfieldID fid = (*env)->GetStaticFieldID(env, cls, "TELEPHONY_SERVICE",
    "Ljava/lang/String;");
jstring str = (*env)->GetStaticObjectField(env, cls, fid);
jobject telephony = (*env)->CallObjectMethod(env, context, mid, str);
cls = (*env)->FindClass(env, "android/telephony/TelephonyManager");
mid =(*env)->GetMethodID(env, cls, "getDeviceId", "()Ljava/lang/String;");
str = (*env)->CallObjectMethod(env, telephony, mid);
jsize len = (*env)->GetStringUTFLength(env, str);
char* deviceId = calloc(len + 1, 1);
(*env)->GetStringUTFRegion(env, str, 0, len, deviceId);
(*env)->DeleteLocalRef(env, str);
/* to get a string in deviceId */
于 2012-07-25T06:32:06.343 に答える
0

Java 側で MEID を取得し、jstringパラメータとして JNI 関数に渡します。C から Java にコールバックするよりもクリーンになります。

それを取得する方法については、Abhilasha の回答を参照してください。

于 2012-07-25T15:50:30.650 に答える