我在qt程式中運行了以下代碼,jstr值為null。
我在 .pro 檔案中添加了 [androidextras]。我在 Androidmanifest.xml 中添加了 [READ_PHONE_STATE] 權限。我已經在 Android 12 上運行了這個應用程式。
請告知為什么 jstr 的值為空?如果有更好的方法,請幫助我。
我想當用戶登錄時,用戶不能再在另一臺設備上運行相同ID的程式,或者部分程式無法運行?
這段代碼:
#include <QAndroidJniObject>
#include <QAndroidJniEnvironment>
#include <QtAndroid>
void getDeviceImei()
{
QAndroidJniEnvironment env;
jclass contextClass = env->FindClass("android/content/Context");
jfieldID fieldId = env->GetStaticFieldID(contextClass, "TELEPHONY_SERVICE", "Ljava/lang/String;");
jstring telephonyManagerType = (jstring) env->GetStaticObjectField(contextClass, fieldId);
jclass telephonyManagerClass = env->FindClass("android/telephony/TelephonyManager");
jmethodID methodId = env->GetMethodID(contextClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
QAndroidJniObject qtActivityObj = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
jobject telephonyManager = env->CallObjectMethod(qtActivityObj.object<jobject>(), methodId, telephonyManagerType);
methodId = env->GetMethodID(telephonyManagerClass, "getDeviceId", "()Ljava/lang/String;");
jstring jstr = (jstring) env->CallObjectMethod(telephonyManager, methodId);
qDebug() << "## methodId -->> " << methodId;
qDebug() << "## jstr -->> " << jstr; // NULL
jsize len = env->GetStringUTFLength(jstr);
char* buf_devid = new char[32];
env->GetStringUTFRegion(jstr, 0, len, buf_devid);
QString imei(buf_devid);
qDebug() << "## imei -->> " << imei;
}
uj5u.com熱心網友回復:
GetDeviceId 已棄用。現在應該是getIMEI。但無論哪種方式都行不通——你需要 READ_PRIVILEGED_PHONE_STATE 而不是 READ_PHONE_STATE。PRIVLIDGED 版本僅適用于系統應用程式 - 您需要預先安裝或 root 手機才能將應用程式轉變為 privlidged 應用程式。您無法將這些資料作為普通應用程式獲取。
此更改是出于隱私問題。設備上幾乎所有的唯一 ID 現在要么在每次應用安裝時隨機化,要么完全洗掉。這樣您就無法跨安裝跟蹤某人(除非他們與您建立帳戶)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/520144.html
上一篇:PyQt5-QTime不改變值
