获取手机电量和通讯录

我们在有一些游戏的时候需要获取手机的信息,有的时候还会获取用户的通讯录权限,我是无聊的时候研究了一下看看是如何获取的,研究完了,记下来,万一以后会遇到或许还会有用呢,毕竟脑子不好使嘛。

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,因为我的手机一直在充电。

这里说明一下,这个电池的电量信息,每次有变化监听都会有反应。

 

 

 

android 获取电池状态 不监听 安卓开发获取手机电量_android 获取电池状态 不监听

 

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);

结果是:

 

android 获取电池状态 不监听 安卓开发获取手机电量_#if_02

上面的截图也可以看到结果,需要注意的是,最后获取到的结果是一个json,如果需要的话,还需要解析一下的,解析的步骤在这里就不说了。