检测我的apk是在眼镜设备上运行还是移动设备上运行

3

我编写了一个包含Java和本地C代码的Android应用程序。

我知道可以使用以下代码行预测我的APK当前是否在Glass上运行:

如何在本地C代码中进行类似的检测?

if (android.os.Build.MODEL.contains("Glass")) {


我建议你检查Build.MANUFACTURER是否为“Google”,并且Build.MODEL是否以“Glass”开头。其他制造商可能会生产具有“Glass”型号的产品。 - ErstwhileIII
1个回答

1
您好,您有两种方法来完成这个任务,但都需要使用JNI

选项A:创建一个名为“DeviceInfo”的类,附加一个静态方法。

boolean isGlassDevice() {
    return android.os.Build.MODEL.contains("Glass");
}

从你的C/C++函数中:

jclass jc_your_class = (*env)->FindClass(env, "com.your.util.DeviceInfo" ); // YOUR DeviceInfo class
jmethodID jmid_is_glass_device = (*env)->GetMethodID(env, jc_your_class, "isGlassDevice", "()Z"); // Get info method.

jboolean jb_is_glass_device = (*env)->CallStaticBooleanMethod(env, jc_your_class, jmid_is_glass_device);    

if (jb_is_glass_device == JNI_TRUE){
    // Your code goes here...
}

选项B。使用JNI来处理所有杂活:
jclass jc_build = (*env)->FindClass(env, "android/os/Build" ); // Build class
jfieldID jfid_kMODEL = (*env)->GetStaticFieldID(env, jc_build, "MODEL", "Ljava/lang/String;"); // MODEL attr.

jstring js_model_value = (*env)->GetStaticObjectField(env, obj, jfid_kMODEL); // MODEL attr. value.
jstring js_glass_value = (*env)->NewStringUTF(env, "Glass"); // Glass string value.

const char * nat_model_value = (*env)->GetStringUTFChars( env, js_model_value, NULL ) ;
const char * nat_glass_value = (*env)->GetStringUTFChars( env, js_glass_value, NULL ) ;

if (strcmp(nat_model_value, nat_glass_value) == 0){
    // Both strings are equal
}

我更喜欢第一种方法,因为它比选项B更小。最后,请记住,JVM和您的C/C++代码之间的JNI调用与Java-to-Java和C-to-C相比非常缓慢,因此您需要找到减少Java和C/C++之间调用的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接