精华内容
下载资源
问答
  • 设计权限问题时,从网络上获取用户的用户名和密码,这时会获取到用户的权限 ID或者是其他的state 相应的state对应着不同的权限设置 如果state = 1时 他的权限是管理员,可以修改任何地方。 如果state = 2时 他的...
  • 在 iOS开发中有时候会遇到这样一个需求,当 APP 中需要获取使用相机/相册等系统的权限时,而用户第一次却没有授权,当用户再次进入时,我们则需要提示用户去开启权限,并且直接跳到系统的设置界面授权。方法有2种 ...

    在 iOS开发中有时候会遇到这样一个需求,当 APP 中需要获取使用相机/相册等系统的权限时,而用户第一次却没有授权,当用户再次进入时,我们则需要提示用户去开启权限,并且直接跳到系统的设置界面授权。

    方法有2种
    一、直接在跳转按钮的点击事件方法中添加如下代码

    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }

    注意:这里可能会出现以下警告,图1是 iOS9出现的,图2是 iOS10出现的
    图1
    图1
    图2
    这里写图片描述
    造成这种情况一般是在错的线程中执行了某些操作,解决办法是采用延时机制

    dispatch_after(0.2, dispatch_get_main_queue(), ^{
        NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        if ([[UIApplication sharedApplication] canOpenURL:url]) {
            [[UIApplication sharedApplication] openURL:url];
        }
    });

    二、
    1.先在跳转按钮的点击事件方法中添加如下代码,iOS10之后有变化,所以要添加一个判断

    NSURL *url = [NSURL URLWithString:@"App-Prefs:root=WIFI"];
    if ([[UIApplication sharedApplication] canOpenURL:url]){
        if ([[UIDevice currentDevice].systemVersion doubleValue] >= 10.0) {
            [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
        }else{
            [[UIApplication sharedApplication] openURL:url];
        }
    }

    2.然后在项目中的info.plist中添加 URL types 并设置一项URL Schemes为prefs,如下图:

    这里写图片描述

    注意:String 字段那里@”App-Prefs:root=WIFI”,iOS10以下的版本可以不加“ App-”,但 iOS10以上的版本要加,不然跳转不了。

    这里演示的是跳转至系统的 WIFI 界面,当然你也可以修改字符串,跳到相应的设置界面

    @"App-prefs:root=WIFI" //打开WiFi
    @"App-prefs:root=Bluetooth" //打开蓝牙设置页 
    @"App-prefs:root=AIRPLANE_MODE" //打开飞行模式
    @"App-prefs:root=MOBILE_DATA_SETTINGS_ID" //蜂窝移动网络
    @"App-prefs:root=INTERNET_TETHERING" //个人热点
    @"App-prefs:root=NOTIFICATIONS_ID" //通知设置
    @"App-prefs:root=General" //通用
    @"App-prefs:root=General&path=About" //通用-关于本机      
    @"App-prefs:root=DISPLAY&BRIGHTNESS" //显示与亮度
    @"App-prefs:root=Wallpaper" //墙纸
    @"App-prefs:root=Sounds" //声音
    @"App-prefs:root=Privacy" //隐私
    @"App-prefs:root=STORE" //存储
    @"App-prefs:root=NOTES" //备忘录
    @"App-prefs:root=SAFARI" //Safari
    @"App-prefs:root=MUSIC" //音乐
    @"App-prefs:root=Photos" //照片与相机
    @"App-prefs:root=CASTLE" //iCloud
    @"App-prefs:root=FACETIME" //FaceTime
    @"App-prefs:root=LOCATION_SERVICES" //定位服务
    @"App-prefs:root=Phone" //电话
    //通用下常用字段
    @"prefs:root=General&path=About" //关于本机
    @"prefs:root=General&path=SOFTWARE_UPDATE_LINK" //软件更新
    @"prefs:root=General&path=DATE_AND_TIME" //日期和时间
    @"prefs:root=General&path=ACCESSIBILITY" //辅助功能
    @"prefs:root=General&path=Keyboard" //键盘
    @"prefs:root=General&path=VPN" //VPN设置
    @"prefs:root=General&path=AUTOLOCK" //自动锁屏
    @"prefs:root=General&path=INTERNATIONAL" //语言与地区
    @"prefs:root=General&path=ManagedConfigurationList" //描述文件
    //隐私下常用字段
    @"prefs:root=Privacy&path=CAMERA" //设置相机使用权限
    @"prefs:root=Privacy&path=PHOTOS" //设置照片使用权限
    
    展开全文
  • 4.2.2(Jelly Bean)上root的方法比较简单,调用su命令就可以获取到root权限并执行一些命令。但是在Android 4.3+到5.0,Google为这种root方法设置了层层障碍:  1. su命令源码中添加了uid检验,只允许shell/root用户...

    4.2.2(Jelly Bean)上root的方法比较简单,调用su命令就可以获取到root权限并执行一些命令。但是在Android 4.3+到5.0,Google为这种root方法设置了层层障碍: 
    1. su命令源码中添加了uid检验,只允许shell/root用户进行调用  
    2. Zygote源码中添加了添加DropCapabilitiesBoundingSet屏蔽APP了setuid的功能 
    3. adb源码中添加了添加should_drop_privileges屏蔽adb了setuid的功能(对于userdebug/eng版本该函数未被调用) 
    4. 开启了SELinux安全模块,1,2条都满足情况下也会被中断su。

    具体解决方法:

    针对前三项的解决方法是按照以下diff文件进行修改代码并重新编译Android系统:

    su命令源码中添加了uid检验,只允许shell/root用户进行调用 
    Zygote源码中添加了添加DropCapabilitiesBoundingSet屏蔽APP了setuid的功能
    adb源码中添加了添加should_drop_privileges屏蔽adb了setuid的功能(对于userdebug/eng版本该函数未被调用)
    以上三项需要改动代码并重新编译Android系统。 
    1,2,3代码修改的diff文件:

    project frameworks/base/
    diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
    index 1bb28c3..3e69750 100644
    --- a/cmds/app_process/app_main.cpp
    +++ b/cmds/app_process/app_main.cpp
    @@ -185,6 +185,7 @@ static const char ZYGOTE_NICE_NAME[] = "zygote";

     int main(int argc, char* const argv[])
     {
    +/*
         if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
             // Older kernels don't understand PR_SET_NO_NEW_PRIVS and return
             // EINVAL. Don't die on such kernels.
    @@ -193,6 +194,7 @@ int main(int argc, char* const argv[])
                 return 12;
             }
         }
    +*/

         AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
         // Process command line arguments
    diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
    index 4f5e08b..8b136bd 100644
    --- a/core/jni/com_android_internal_os_Zygote.cpp
    +++ b/core/jni/com_android_internal_os_Zygote.cpp
    @@ -208,6 +208,7 @@ static void EnableKeepCapabilities(JNIEnv* env) {
     }

     static void DropCapabilitiesBoundingSet(JNIEnv* env) {
    +/*
       for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {
         int rc = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);
         if (rc == -1) {
    @@ -220,6 +221,7 @@ static void DropCapabilitiesBoundingSet(JNIEnv* env) {
           }
         }
       }
    +*/
     }

     static void SetCapabilities(JNIEnv* env, int64_t permitted, int64_t effective) {

    project system/core/
    diff --git a/adb/adb.c b/adb/adb.c
    index 10a1e0d..2cd4f97 100644
    --- a/adb/adb.c
    +++ b/adb/adb.c
    @@ -1261,6 +1261,7 @@ static void drop_capabilities_bounding_set_if_needed() {
     }

     static int should_drop_privileges() {
    +    return 0;
     #ifndef ALLOW_ADBD_ROOT
         return 1;
     #else /* ALLOW_ADBD_ROOT */
    diff --git a/include/private/android_filesystem_config.h b/include/private/android_filesystem_config.h
    index 2f528b9..1223b45 100644
    --- a/include/private/android_filesystem_config.h
    +++ b/include/private/android_filesystem_config.h
    @@ -244,7 +244,7 @@ static const struct fs_path_config android_files[] = {

         /* the following five files are INTENTIONALLY set-uid, but they
          * are NOT included on user builds. */
    -    { 04750, AID_ROOT,      AID_SHELL,     0, "system/xbin/su" },
    +    { 06755, AID_ROOT,      AID_SHELL,     0, "system/xbin/su" },
         { 06755, AID_ROOT,      AID_ROOT,      0, "system/xbin/librank" },
         { 06755, AID_ROOT,      AID_ROOT,      0, "system/xbin/procrank" },
         { 06755, AID_ROOT,      AID_ROOT,      0, "system/xbin/procmem" },
    @@ -255,6 +255,7 @@ static const struct fs_path_config android_files[] = {

         { 00750, AID_ROOT,      AID_ROOT,      0, "system/bin/uncrypt" },
         { 00750, AID_ROOT,      AID_ROOT,      0, "system/bin/install-recovery.sh" },
    +    { 06755, AID_ROOT,      AID_ROOT,      0, "system/bin/su" },
         { 00755, AID_ROOT,      AID_SHELL,     0, "system/bin/*" },
         { 00755, AID_ROOT,      AID_ROOT,      0, "system/lib/valgrind/*" },
         { 00755, AID_ROOT,      AID_ROOT,      0, "system/lib64/valgrind/*" },

    project system/extras/
    diff --git a/su/su.c b/su/su.c
    index 8365379..826acfc 100644
    --- a/su/su.c
    +++ b/su/su.c
    @@ -107,11 +107,12 @@ int main(int argc, char **argv)

         /* Until we have something better, only root and the shell can use su. */
         myuid = getuid();
    +    /*
         if (myuid != AID_ROOT && myuid != AID_SHELL) {
             fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
             return 1;
         }
    -
    +    */
         if(argc < 2) {
             uid = gid = 0;
         } else {

    设置SELinux权限为Permissive

    我是尽量把事情简单化,这次这里讨论的是SELinux,其实现原理会比较复杂,我这里只是简单记录在Android 5.0 + Linux 3.4如何将SELinux降级,这么做的原因是实现:APP可以调用su命令最终实现运行一些命令。

    SELinux常用状态有两个Permissive 和 Enforcing,后者会使APP无法调用su命令,前者可以。 
    1. 查询当前SELinux状态:

    adb shell getenforce

    运行该命令后,会输出当前系统的SELinux权限Permissive 和 Enforcing。 
    2. 在eng/userdebug版本 将SELinux 模式调整到Permissive mode

    临时方案:运行如下命令(无需重启系统,即刻见效)
    adb shell setenforce 0

    长久方案:在启动参数中添加
    androidboot.selinux=permissive

    ROOT不成功问题解决方法

    root不成功主要是因为没有改全这些项,有其中一项没有改好都会造成root不成功。这里把每项没有改好会造成的问题列出来以供参考。

    安装运行 HelloRoot App,这是一个协助查看是否能获取root权限的小工具。

    查看HelloRoot的Application user id

    root@nanopi2:/ # ps | grep com.example.helloroot
    u0_a50    1283  121   1233532 40640 ffffffff b6e791c4 S com.example.helloroot
    root@nanopi2:/ #

    其中u0_a50就是HelloRoot的Application user id了,这个id在下面步骤中会用到;

    切换到u0_a50用户下并运行su命令
    root@nanopi2:/ # su u0_a50
    root@nanopi2:/ $ id
    uid=10050(u0_a50) gid=10050(u0_a50) groups=1003(graphics),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:su:s0
    # 以u0_a50身份运行su命令,正常情况下会再切到root权限下
    root@nanopi2:/ $ su
    root@nanopi2:/ #

    不正常的话会出现如下错误:
    su: can't execute: Permission denied
    这个属于u0_a50对su无可执行权限,说明include/private/android_filesystem_config.h中需要改的内容没有改或者是没有改成功。
    su: uid 10050 not allowed to su
    这个属于su不允许su和shell以外的用户(比如u0_a50)调用,说明su.c中需要改的内容没有改或者是没有改成功。
    点击CheckRoot按钮,判断App是否可以root,如果Log信息如下:

    System.err: java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
    System.err:     at java.lang.ProcessManager.exec(ProcessManager.java:211)
    System.err:     at java.lang.Runtime.exec(Runtime.java:173)
    System.err:     at java.lang.Runtime.exec(Runtime.java:246)
    System.err:     at java.lang.Runtime.exec(Runtime.java:189)
    System.err:     at cn.trinea.android.common.util.ShellUtils.execCommand(ShellUtils.java:135)
    System.err:     at cn.trinea.android.common.util.ShellUtils.execCommand(ShellUtils.java:93)
    System.err:     at cn.trinea.android.common.util.ShellUtils.checkRootPermission(ShellUtils.java:44)
    System.err:     at com.example.helloroot.MainActivity.onCreate(MainActivity.java:25)
    System.err:     at android.app.Activity.performCreate(Activity.java:5990)
    System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
    System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
    System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
    System.err:     at android.app.ActivityThread.access$800(ActivityThread.java:151)
    System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
    System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
    System.err:     at android.os.Looper.loop(Looper.java:135)
    System.err:     at android.app.ActivityThread.main(ActivityThread.java:5254)
    System.err:     at java.lang.reflect.Method.invoke(Native Method)
    System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
    System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
    System.err: Caused by: java.io.IOException: Permission denied
    System.err:     at java.lang.ProcessManager.exec(Native Method)
    System.err:     at java.lang.ProcessManager.exec(ProcessManager.java:209)
    System.err:     ... 20 more
    System.err: java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
    System.err:     at java.lang.ProcessManager.exec(ProcessManager.java:211)
    System.err:     at java.lang.Runtime.exec(Runtime.java:173)
    System.err:     at java.lang.Runtime.exec(Runtime.java:246)
    System.err:     at java.lang.Runtime.exec(Runtime.java:189)
    System.err:     at cn.trinea.android.common.util.ShellUtils.execCommand(ShellUtils.java:135)
    System.err:     at cn.trinea.android.common.util.ShellUtils.execCommand(ShellUtils.java:56)
    System.err:     at com.example.helloroot.MainActivity.onCreate(MainActivity.java:26)
    System.err:     at android.app.Activity.performCreate(Activity.java:5990)
    System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
    System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
    System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
    System.err:     at android.app.ActivityThread.access$800(ActivityThread.java:151)
    System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
    System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
    System.err:     at android.os.Looper.loop(Looper.java:135)
    System.err:     at android.app.ActivityThread.main(ActivityThread.java:5254)
    System.err:     at java.lang.reflect.Method.invoke(Native Method)
    System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
    System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
    System.err: Caused by: java.io.IOException: Permission denied
    System.err:     at java.lang.ProcessManager.exec(Native Method)
    System.err:     at      ... 19 more

    A. 出现这个问题是由于没有将SELinux关闭,需要按照以下方法查看

    # 通过查看SELinux状态
    root@nanopi2:/ # getenforce
    Enforcing

    需要按照「设置SELinux权限为Permissive」进行设置。 
    B. 无法setuid的限制修改 
    core/jni/com_android_internal_os_Zygote.cpp和cmds/app_process/app_main.cpp修改。

    参考文档: 
    1. How to set SELinux to 0 or permissive mode in android 4.4.4 and above? by user1147688 
    2. user版本如何打开root权限 
     

    https://blog.csdn.net/kangear/article/details/51872653

    展开全文
  • 本源码演示Android如何获取系统内置的APP应用列表信息,比如获取android系统中的录音机、相机、应用包访问权限帮助程序、android系统信息、设置、联系人存储、外部存储设备属性、Android键盘(AOSP)、移动数据信息...
  • 为此给出用户指导,引导用户启动系统中的权限设置设置信任。到此,问题就来了:我们不知道权限设定的包名,也不知道权限设置的Activity的名字,如何启动到指定的界面呢? 今天我们就来解决这个问题。 首先,我们...

    这次博主来分享一个很巧妙的办法来启动其他APP中Activity的方法。
    首先说一下这样做的目的:最近博主在攻克一个技术难点,就是搞定某些三方系统中,对于应用权限的限制。为此给出用户指导,引导用户启动系统中的权限设置来设置信任。到此,问题就来了:我们不知道权限设定的包名,也不知道权限设置的Activity的名字,如何启动到指定的界面呢?
    今天我们就来解决这个问题。
    首先,我们需要一台已经获取Root权限了的手机。当然,模拟器之流也是可以考虑的。还有RE(Root Explorer)文件浏览器,用来浏览AndroidManifest.xml。这里注意的是,不要试图复制到电脑上查看,回是乱码的。
    然后,我们开始通过包名来查找有可能的程序。由于博主手里用的测试机是华为的机器,因此以华为为例。其他厂商的手机请各位自行查找,方法应该是一致的。
    使用RE文件浏览器,获取读写权限,依次打开/system/app。在这里,你将会看到好多APK。由于RE文件浏览器能够预览APK的图标,所以我们可以很轻松地通过软件图标,找到权限管理所属的APK文件。以华为最新的EMUI为例,权限管理所属的软件是手机管家,APK的文件名为:“HwSystemManager.apk”。
    使用RE文件浏览器打开APK,选择查看,即可看到解压后的文件。也就可以直接找到AndroidManifest.xml。继续使用RE文件浏览器打开这个xml文件,其中的Activity的名字便一览无遗了。
    最后,找到正确的Activity,启动它即可。
    这样,就能够在用户指导的权限设置页给出正确的启动入口了。当然,此方法也适用于启动任何一个APP中的Activity,只要配置文件中的exported值不为false即可启动。
    小小技巧,班门弄斧。不足之处,望路过大神多多指教。

    展开全文
  • 此应用程序基于服务器如何向外部服务器请求以获取数据,以及有关设置API Keys。此应用程序还可以在帮助下自动将地点建议为用户类型。 授予访问位置以获取更好的自动建议地点的权限。 在本地机器上开发 这需要设置一...
  • 需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行...

    小程序获取手机号码

    1、获取手机号码前提条件

    该小程序为非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限
    

    2、开发

    需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。
    其中session_key通过wx.login来换取用户code,然后通过code到服务端换取用户唯一openid和session_key;
    
    1、view部分
        <button open-type="getPhoneNumber" bindgetphonenumber="bindgetphonenumber"></button>
    2、js部分
       bindgetphonenumber(e){
            //e里面的数据为加密,需要通过签名算法解密,详情见官方文档
            console.log(e.detail.errMsg)
            console.log(e.detail.iv)
            console.log(e.detail.encryptedData);
            //通过服务端解密
            wx.request({
                url:"自己服务端地址",
                method:"POST",
                data:{
                    encryptedData: e.detail.encryptedData,
    				errMsg: e.detail.encryptedData,
    				iv: e.detail.iv,
    				session_key:session_key //通过登录获得
                }success(resp){
                   //后台解密成功返回的数据包
                    /*
                   {
                        "phoneNumber": "13580006666",
                        "purePhoneNumber": "13580006666",
                        "countryCode": "86",
                        "watermark":
                        {
                            "appid":"APPID",
                            "timestamp": TIMESTAMP
                        }
                    }
                   */
                    ...
                }
            })
       }
    3、服务端 php语言
         public  function decPhone(){
            	//seeionkey
        		$openid=input('?post.openid')?input('post.openid'):"";
        		$session_key=input("?post.session_key")?input("post.session_key"):"";
        		$encryptedData=input('?post.encryptedData')?input('post.encryptedData'):"";
        		$iv=input('?post.iv')?input('post.iv'):"";
        		if ($openid=='') return 
        		$wxdec=new \WXBizDataCrypt($this->appid,$session_key);
        		$errCode = $wxdec->decryptData($encryptedData, $iv, $data );
        		if ($errCode == 0) {
        			return ajaxErr(0,'获取',json_decode($data,true));
        		} else {
        			return ajaxErr(10001,'获取',$errCode);
        		}
        }
    

    4、服务端 WXBizDataCrypt.php

    <?php
    
    /**
     * 对微信小程序用户加密数据的解密示例代码.
     *
     * @copyright Copyright (c) 1998-2014 Tencent Inc.
     */
    
    
    include_once "errorCode.php";
    
    
    class WXBizDataCrypt
    {
        private $appid;
    	private $sessionKey;
    
    	/**
    	 * 构造函数
    	 * @param $sessionKey string 用户在小程序登录后获取的会话密钥
    	 * @param $appid string 小程序的appid
    	 */
    	public function __construct( $appid, $sessionKey)
    	{
    		$this->sessionKey = $sessionKey;
    		$this->appid = $appid;
    	}
    
    
    	/**
    	 * 检验数据的真实性,并且获取解密后的明文.
    	 * @param $encryptedData string 加密的用户数据
    	 * @param $iv string 与用户数据一同返回的初始向量
    	 * @param $data string 解密后的原文
         *
    	 * @return int 成功0,失败返回对应的错误码
    	 */
    	public function decryptData( $encryptedData, $iv, &$data )
    	{
    		if (strlen($this->sessionKey) != 24) {
    			return ErrorCode::$IllegalAesKey;
    		}
    		$aesKey=base64_decode($this->sessionKey);
    
            
    		if (strlen($iv) != 24) {
    			return ErrorCode::$IllegalIv;
    		}
    		$aesIV=base64_decode($iv);
    
    		$aesCipher=base64_decode($encryptedData);
    
    		$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
    
    		$dataObj=json_decode( $result );
    		if( $dataObj  == NULL )
    		{
    			return ErrorCode::$IllegalBuffer;
    		}
    		if( $dataObj->watermark->appid != $this->appid )
    		{
    			return ErrorCode::$IllegalBuffer;
    		}
    		$data = $result;
    		return ErrorCode::$OK;
    	}
    
    }
    

    5、返回错误实例 errorCode.php

    <?php
    
    /**
     * error code 说明.
     * <ul>
    
     *    <li>-41001: encodingAesKey 非法</li>
     *    <li>-41003: aes 解密失败</li>
     *    <li>-41004: 解密后得到的buffer非法</li>
     *    <li>-41005: base64加密失败</li>
     *    <li>-41016: base64解密失败</li>
     * </ul>
     */
    class ErrorCode
    {
    	public static $OK = 0;
    	public static $IllegalAesKey = -41001;
    	public static $IllegalIv = -41002;
    	public static $IllegalBuffer = -41003;
    	public static $DecodeBase64Error = -41004;
    }
    
    ?>
    

    到此微信小程序获取用户手机号码就结束了

    展开全文
  • toast("用户已经在权限设置页授予了录音和日历权限"); } else { toast("用户没有在权限设置页授予权限"); } } } } 关于权限监听回调参数说明 我们都知道,如果用户全部授予只会调用 onGranted 方法,如果...
  • 用例说明 对用户进行管理,包括对用户资料、用户等级、用户权限、用户设置信息等等。 前置条件 已经通过登录验证 基本事件流 参与者动作 后台响应 1. 用户资料管理 2. 用户等级管理 3. 用户权限管理 4.用户设置信息...
  • 考虑用户操作的便利性,设置为每次运行默认获取系统管理员权限,以下为设置步骤 1、在Visual Studio 中--解决方案资源管理器--右键项目名称--属性,找到“安全性”选项,勾选“启用ClickOnce安全设置”: 2、...
  • 视频较大,陆续上传中。...091-制作启动图片和设置APP权限模块.avi 092-使用云端打包方式将项目发布为apk文件.avi 093-安装发布好的apk文件并预览APP运行效果.avi 本套教程用到的软件和资源.zip 配置文件路径.txt
  • //获取CameraScan,扫码相关的配置设置。CameraScan里面包含部分支持链式调用的方法,即调用返回是CameraScan本身的一些配置建议在startCamera之前调用。 getCameraScan().setPlayBeep(true)//设置是否播放音效,...
  • BOS代码二次开发FAQ

    2019-04-11 15:49:40
    BOS代码二次开发FAQ 一.Coding的结构体系 1.代码目录结构 ...4.如何通过二次开发设置BIM不支持数据类型的初始置 5. 通用过滤中如何实现F7的组织隔离? 6. 如何在BIM开发复制新增时不复制二次开发的字段
  • 因此Google play为我们提供了许可服务,借助该服务,应用可以在运行时查询google play服务器,获取当前用户的许可状态,APP可以根据具体的情况禁止或允许用户进一步使用。以下是官方文档的链接:应用许可。 本博客...
  • APP常规数据统计本节主要介绍如何设置数据上报策略,如何记录页面访问行为和用户自定义事件。本节也介绍了通过集成测试模块验证SDK是否集成成功的方法。3.1. 数据上报策略统计服务SDK会先把数据记录缓存在本地,然后...
  • 微信OAuth2.0受权分为snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取...
  • 支持用户权限管理,管理员+操作员两大类,用户登录+用户退出,可以记住密码和自动登录,超过三次报错提示并关闭程序。 支持四种监控模式,设备面板监控+地图监控+表格数据监控+曲线数据监控,可自由切换,四种同步...
  • //获取用户的token const token = uni.getStorageSync('uni_id_token') //获取当前页面路径(即url去掉"?"和"?"后的参数) const url = e.url.split('?')[0] //拦截强制登录页面 if (need...
  • //获取用户的token const token = uni.getStorageSync('uni_id_token') //获取当前页面路径(即url去掉"?"和"?"后的参数) const url = e.url.split('?')[0] //拦截强制登录页面 if (need...

空空如也

空空如也

1 2 3 4 5 6
收藏数 102
精华内容 40
关键字:

如何设置app获取用户权限