获取手机电量和通讯录

                                                        获取手机电量和通讯录

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

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,如果需要的话,还需要解析一下的,解析的步骤在这里就不说了。

猜你喜欢

转载自blog.csdn.net/pyf_914406232/article/details/80067716