获取手机电量和通讯录
我们在有一些游戏的时候需要获取手机的信息,有的时候还会获取用户的通讯录权限,我是无聊的时候研究了一下看看是如何获取的,研究完了,记下来,万一以后会遇到或许还会有用呢,毕竟脑子不好使嘛。
1. 获取电量
C++方法如下:
//添加获取当前电量方法
void HelloWorld::GetBatteryLevel(int &batteryLevel)
{
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/cpp/AppActivity", "getBatteryLevel", "()I");
if (isHave)
{
jint battery = (jint)minfo.env->CallStaticIntMethod(minfo.classID, minfo.methodID);
log(" cocos2dx--currentBattery :%d----------", battery);
batteryLevel = battery;
minfo.env->DeleteLocalRef(minfo.classID);
}
else
{
cocos2d::log("JniFun call GetBatteryLevel error!");
}
#endif
#if(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
batteryLevel = IOSCommonFunc::GetInstance().getBatteryLeve();
#endif
}
那么在java中添加如下方法:
//--------------------------------------电量信息 begin------------------------------------------
class BatteryBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//判断它是否是为电量变化的Broadcast Action
if(Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())){
//获取当前电量
int level = intent.getIntExtra("level", 0);
//电量的总刻度
int scale = intent.getIntExtra("scale", 100);
//把它转成百分比
batteryLevel = level * 100 / scale;
Log.d("batteryLevel", "batteryLevel-----------------------"+batteryLevel);
}
}
}
//获取电量信息
public static int getBatteryLevel() {
Log.d("getBatteryLevel", "enter the function getBatteryLevel ----- ");
Log.d("getBatteryLevel", "java ---- netLevel --- "+ batteryLevel);
return batteryLevel;
}
//--------------------------------------电量信息 end------------------------------------------
添加完之后会发现报错,是因为没有定义变量以及方法,在文件前面添加如下变量:
//添加获取电量方法--------------------------begin
BatteryBroadcastReceiver receiver = new BatteryBroadcastReceiver();
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
public static int batteryLevel = 0;
//添加获取电量方法--------------------------end
到了这里你会发现没有报错,但是打包之后还是获取不到,而且还会报错,这是因为没有添加电量信息监听,在onCreate中添加监听。
//添加电量信息监听
registerReceiver(receiver, filter);
这样就可以了,我获取到的电量信息是100,因为我的手机一直在充电。
这里说明一下,这个电池的电量信息,每次有变化监听都会有反应。
2. 获取通讯录
C++方法:
std::string HelloWorld::getContactPicker()
{
std::string ret("");
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/cpp/AppActivity", "getContactPicker", "()Ljava/lang/String;");
if (!isHave)
{
log("jni StopBaiDuLocation is null");
}
else
{
jstring str = (jstring)minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
minfo.env->DeleteLocalRef(minfo.classID);
ret = JniHelper::jstring2string(str);
//std::cout<<ret<<end;
minfo.env->DeleteLocalRef(str);
}
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
ret = IOSPlatform::GetInstance().getContactPicker();
#endif
return ret;
}
Java中的代码如下:
public static String getContactPicker() throws JSONException{
//安卓6.0之后部分特别重要的权限是需要单独申请的,而不是在安装的时候同意就好
int currentVersion = android.os.Build.VERSION.SDK_INT;
Log.d("getContactPicker", "enter the function getContactPicker ----- ");
if (currentVersion >= 23)
{
if (ContextCompat.checkSelfPermission(instance, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(instance, new String[]{Manifest.permission.READ_CONTACTS}, 0);//申请权限
}
else
{
//拥有当前权限
}
}
ContentResolver resolver = instance.getContentResolver();
String[] cols = {ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,cols, null, null, null);
Log.d("getContactPicker", "enter the function getContactPicker -----111111111111-- "+cursor.getCount());
JSONArray root = new JSONArray();
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME);
int numberFieldColumnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
String name = cursor.getString(nameFieldColumnIndex);
String number = cursor.getString(numberFieldColumnIndex);
JSONObject onePerson = new JSONObject();
onePerson.put("sPhoneName", name);
onePerson.put("sPhoneNumber", number);
Log.d("sPhoneName", "sPhoneName"+name);
Log.d("sPhoneNumber", "sPhoneNumber"+number);
root.put(onePerson);
}
JSONObject writeJson = new JSONObject();
writeJson.put("info", root);
return writeJson.toString();
}
到了这里你会发现获取不到手机的通讯录,因为缺少了权限,在清单文件中添加权限:
<!--添加联系人的权限-->
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<uses-permission android:name="android.permission.SEND_SMS" />
再打包测试,我在手机里存了科比和詹姆斯的手机号,就看看能不能获取到。
我的代码如下:
std::string str;
str = this->getContactPicker();
number->setString(str);
结果是:
上面的截图也可以看到结果,需要注意的是,最后获取到的结果是一个json,如果需要的话,还需要解析一下的,解析的步骤在这里就不说了。