HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

强制安卓进入前台运行,完整代码及遇到的坑

安卓 uniapp原生插件

​最近突发奇想,想做一个给自己用的app,主要时做一些个人记录和强制停止无脑刷屏==。
在每次解锁手机或刷视频超过一定时间,后台就把自己开发的app进入前台,提醒自己的目标及可以做其他的事有什么。
网上的资料并不能完整的解决问题,然后就自己撸了一下代码。
todo 之后有空的话把这部分打包成一个uniapp的插件。

完整代码

    Timer topTimer=null;  

    public void startTopTimer(){  
        stopTopTimer();  
        topTimer=new Timer();  
        TimerTask timerTask=new TimerTask() {  
            @Override  
            public void run() {  
                activityInTop();  
            }  
        };  
        topTimer.schedule(timerTask,0,500);  
    }  

    public void stopTopTimer(){  
        if(topTimer!=null){  
            topTimer.cancel();  
            topTimer=null;  
        }  
    }  

    public void activityInTop() {  
        /**获取ActivityManager*/  
        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);  

        /**获得当前运行的task(任务)*/  
        int nowPosition=0;  
        List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(100);  
        for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {  
            /**找到本应用的 task,并将它切换到前台*/  
            if (taskInfo.topActivity.getPackageName().equals(getApplicationContext().getPackageName())) {  
                if(nowPosition==0){  
                    stopTopTimer();  
                    return;  
                }  
                activityManager.moveTaskToFront(taskInfo.id, 0);  
                Log.d(TAG, "找到本应用的 task,并将它切换到前台");  
                return;  
            }  
            nowPosition++;  
        }  
        // 应用需要置顶且前台应用被关闭时,重新打开应用  
        Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);  
    }

使用

startTopTimer();

碰到的坑

应用被关闭时,service需要拉起一个新的应用

// 应用需要置顶且前台应用被关闭时,重新打开应用  
        Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);

moveTaskToFront需要在应用进入后台5-7s后执行

解决方案:执行moveTaskToFront方法后,判断是否成功。不成功每间隔500ms再执行一次,直到成功为止。

继续阅读 »

​最近突发奇想,想做一个给自己用的app,主要时做一些个人记录和强制停止无脑刷屏==。
在每次解锁手机或刷视频超过一定时间,后台就把自己开发的app进入前台,提醒自己的目标及可以做其他的事有什么。
网上的资料并不能完整的解决问题,然后就自己撸了一下代码。
todo 之后有空的话把这部分打包成一个uniapp的插件。

完整代码

    Timer topTimer=null;  

    public void startTopTimer(){  
        stopTopTimer();  
        topTimer=new Timer();  
        TimerTask timerTask=new TimerTask() {  
            @Override  
            public void run() {  
                activityInTop();  
            }  
        };  
        topTimer.schedule(timerTask,0,500);  
    }  

    public void stopTopTimer(){  
        if(topTimer!=null){  
            topTimer.cancel();  
            topTimer=null;  
        }  
    }  

    public void activityInTop() {  
        /**获取ActivityManager*/  
        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);  

        /**获得当前运行的task(任务)*/  
        int nowPosition=0;  
        List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(100);  
        for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {  
            /**找到本应用的 task,并将它切换到前台*/  
            if (taskInfo.topActivity.getPackageName().equals(getApplicationContext().getPackageName())) {  
                if(nowPosition==0){  
                    stopTopTimer();  
                    return;  
                }  
                activityManager.moveTaskToFront(taskInfo.id, 0);  
                Log.d(TAG, "找到本应用的 task,并将它切换到前台");  
                return;  
            }  
            nowPosition++;  
        }  
        // 应用需要置顶且前台应用被关闭时,重新打开应用  
        Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);  
    }

使用

startTopTimer();

碰到的坑

应用被关闭时,service需要拉起一个新的应用

// 应用需要置顶且前台应用被关闭时,重新打开应用  
        Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());  
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);

moveTaskToFront需要在应用进入后台5-7s后执行

解决方案:执行moveTaskToFront方法后,判断是否成功。不成功每间隔500ms再执行一次,直到成功为止。

收起阅读 »

开发境外软件,需要调用谷歌地图

开发境外软件,需要调用谷歌地图

开发境外软件,需要调用谷歌地图

Android 音乐通知栏Native.js版本!

Native.JS uni_app

代码

const androidNotifi = {  
  NotifyID: 237,  
  receiver:null,  
  NotifiService:null,  
  serv: null,  
  intent: null,  
  mNotificationBuild: null,  
  mediaBtn: null,  
  channelID : '1',  
  channelName : '音乐通知',  
  notifiImg:{},  
  getImgTemp: function(audioImage) {  
    return new Promise(resolve => {  
      if (this.notifiImg[encodeURIComponent(audioImage)]) {  
        return resolve(plus.io.convertLocalFileSystemURL(this.notifiImg[encodeURIComponent(audioImage)]));  
      }  
      if(!/^http/.test(audioImage)) {  
        this.notifiImg[encodeURIComponent(audioImage)] = audioImage ? audioImage : '_www/static/image/notifimusic.png';  
        return resolve(plus.io.convertLocalFileSystemURL(audioImage ? audioImage : '_www/static/image/notifimusic.png'));  
      }  
      uni.downloadFile({  
        url: audioImage,  
        complete: res => {  
          this.notifiImg[encodeURIComponent(audioImage)] = res.tempFilePath ? res.tempFilePath : '_www/static/image/notifimusic.png';  
          return resolve(plus.io.convertLocalFileSystemURL(res.tempFilePath ? res.tempFilePath : '_www/static/image/notifimusic.png'));  
        }  
      });  
    });  
  },  
  hideNotifi: function(server = false){  
    this.main&&this.receiver&&this.main.unregisterReceiver(this.receiver);   
    server&&this.serv&&this.serv.stopForeground&&this.serv.stopForeground(this.NotifyID, this.mNotificationBuild) ;  
    if (Number(plus.os.version.split('.')[0])>= 8){     
      this.NotifiService&&this.NotifiService.cancel&&this.NotifiService.cancel(this.channelID,this.NotifyID);   
    } else {      
      this.NotifiService&&this.NotifiService.cancel&&this.NotifiService.cancel(this.NotifyID);   

    }   
    this.receiver = null;  
    this.NotifiService = null;  
    this.serv = null;  
    this.intent = null;  
    this.mNotificationBuild = null;  
    // this.NotifiService&&this.NotifiService.cancelAll&&this.NotifiService.cancelAll();  
    this.mediaBtn ? this.mediaBtn.release() : ''; // 线控销毁  
  },  
  showNotifi:async function(param) {  
    if (uni.$_sko.systemInfo.platform != 'android') {   
      return;  
    }  
    try{  
      param = Object.assign({  
        title : '通知标题',  
        subTitle: '',  
        cont : '通知内容',  
        isPlay: true, // 媒体播放按钮  
        legIcon : plus.io.convertLocalFileSystemURL('_www/static/image/notifimusic.png'),  
        Ongoing : false,    // 不可删除  
      },param);  
      this.main = this.main ? this.main : plus.android.runtimeMainActivity();    
      var Context = plus.android.importClass("android.content.Context");    
      var BitmapFactory = plus.android.importClass("android.graphics.BitmapFactory");    
      var NotificationManager = plus.android.importClass("android.app.NotificationManager");  
      var Notification = plus.android.importClass("android.app.Notification");;    
      var Intent = plus.android.importClass("android.content.Intent");    
      var PendingIntent = plus.android.importClass("android.app.PendingIntent");    
      var androidR = plus.android.importClass("android.R");    
      this.NotifiService = this.NotifiService ? this.NotifiService : this.main.getSystemService(Context.NOTIFICATION_SERVICE);    
      this.intent = this.intent ? this.intent : new Intent(this.main, this.main.getClass());    
      var UNI_MEDIA_BROAD = this.main.getPackageName() + '.mediaBtn';  

      //PendingIntent.getActivity的第二个参数需要设置为随机数,否则多个通知时会导致前面的通知被后面的通知替换Extra的数据    
      var pendingIntent = PendingIntent.getActivity(this.main, 0, this.intent, PendingIntent.FLAG_CANCEL_CURRENT);    
      var firstVersionNumber = Number(plus.os.version.split('.')[0]);    
      var mNotification;    
       //判断当前系统版本在8.0及以上    
      if (firstVersionNumber >= 8){  
          if (this.NotifiService.getNotificationChannel() == null){    
              var NotificationChannel = plus.android.importClass('android.app.NotificationChannel');    
              var channel = new NotificationChannel(this.channelID, this.channelName, NotificationManager.IMPORTANCE_HIGH);      
              this.NotifiService.createNotificationChannel(channel);      
              plus.android.autoCollection(NotificationChannel);  
          }    
          param.callBack&&this.main.startForegroundService(this.intent);  
          mNotification = new Notification.Builder(this.main, this.channelID);    
      } else {      
          mNotification = new Notification.Builder(this.main);      
          param.callBack&&this.main.startService(this.intent);  
      }      

      if(param.callBack) {  
        mNotification.addAction(androidR.drawable.ic_media_previous, "prev", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.prev'), PendingIntent.FLAG_CANCEL_CURRENT));  
        mNotification.addAction((param.isPlay ? androidR.drawable.ic_media_pause : androidR.drawable.ic_media_play), "play", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.play'), PendingIntent.FLAG_CANCEL_CURRENT));  
        mNotification.addAction(androidR.drawable.ic_media_next, "next", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.next'), PendingIntent.FLAG_CANCEL_CURRENT));  
        var mMediaStyle = new Notification.MediaStyle();  
        mMediaStyle.setShowActionsInCompactView(0, 1, 2);  
        mNotification.setStyle(mMediaStyle);  
      }  
      mNotification.setOngoing(param.Ongoing);        
      param.legIcon&&mNotification.setLargeIcon(BitmapFactory.decodeFile(await this.getImgTemp(param.legIcon)));  
       mNotification.setSmallIcon(param.callBack?androidR.drawable.stat_sys_headset:androidR.drawable.stat_notify_chat); //设置图标    
       mNotification.setContentTitle(param.title);//设置标题  
       mNotification.setContentText(param.cont); //设置内容    
       param.subTitle&&mNotification.setSubText(param.subTitle);        //子内容暂时去掉    
       // mNotification.setAutoCancel(true);       //设置点击消失    
       //  mNotification.setShowWhen(true);         //显示通知时间    
       mNotification.setTicker("PadInfo");       //弹出通知    
       mNotification.setDefaults(Notification.DEFAULT_ALL);    
       // mNotification.setPriority(Notification.PRIORITY_DEFAULT);   //通知优先级      
       // mNotification.flags=Notification.FLAG_ONLY_ALERT_ONCE;     //发起通知时震动      
       mNotification.setContentIntent(pendingIntent);      

       this.mNotificationBuild = mNotification.build();  
       if (firstVersionNumber>= 8){      
         this.NotifiService.notify(this.channelID, this.NotifyID, this.mNotificationBuild);        
       } else {      
         this.NotifiService.notify(this.NotifyID, this.mNotificationBuild);      
       }   
       if(param.callBack) {  
          this.main&&this.receiver&&this.main.unregisterReceiver(this.receiver);   
          this.receiver = this.receiver ? this.receiver : plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {    
            onReceive: function(context, intent) { //实现onReceiver回调函数    
              param.callBack(intent.getAction().replace(UNI_MEDIA_BROAD + '.',''));    
            }    
          });   
        var IntentFilter = plus.android.importClass('android.content.IntentFilter');    
        var filter = new IntentFilter();    
        filter.addAction(UNI_MEDIA_BROAD + '.prev');  
        filter.addAction(UNI_MEDIA_BROAD + '.play');  
        filter.addAction(UNI_MEDIA_BROAD + '.next');  
        this.main.unregisterReceiver(this.receiver);  
        this.main.registerReceiver(this.receiver, filter); //注册监听    
        this.mediaBtn = uni.requireNativePlugin('uniMediaButton');  // 监听线控  需要配合附件中的插件( Android API >= 26)  
        this.mediaBtn.initMediaButton(res => {  
           console.log(res.message);  
          // 绑定失败/销毁  
          if(res.code == '-1') {  
            this.mediaBtn = null;  
            return;  
          }  
           // res.keyAction == 1 按键松开 res.keyAction == 0 按键按下 播放按钮肯能只有按下  
          if(res.keyCode && res.keyAction == '0') {  
            switch (res.keyCode){  
              case 88:  
                param.callBack(  
                  'prev'  
                );  
                break;  
              case 87:  
                param.callBack(  
                  'next'  
                );  
                break;  
              case 127:  
              case 126:  
                param.callBack(  
                  'play'  
                );  
                break;  
            }  
          }  
        });  
        var serv = plus.android.importClass("android.app.Service");  
        this.serv = this.serv ? this.serv : new serv();  
        this.serv.startForeground(this.NotifyID, this.mNotificationBuild);  
        plus.android.autoCollection(serv);  
        plus.android.autoCollection(IntentFilter);  
       }  
      plus.android.autoCollection(Context);  
      plus.android.autoCollection(BitmapFactory);  
      plus.android.autoCollection(NotificationManager);  
      plus.android.autoCollection(Notification);  
      plus.android.autoCollection(Intent);  
      plus.android.autoCollection(PendingIntent);  
      plus.android.autoCollection(androidR);  
      plus.android.autoCollection(this.receiver);  

    }catch(e){  
      console.log(e);  
    }  
  }  
};

使用方法

// 开启 - 更新标题/播放(暂停)按钮  
show();  
function show(){  
    androidNotifi.showNotifi({  
        title : '通知标题',  
        subTitle: '通知小标题',  
        cont : '通知内容',  
        isPlay: true, // 媒体播放按钮状态(控制播放/暂停按钮样式)  
        legIcon : '', // 封面图片  
        Ongoing : false,    // 是否可删除  
        callBack:function(res){  
            switch (res){  
            case 'play':  
        console.log('play');  
        break;  
        case 'prev':  
        console.log('prev');  
        break;  
        case 'next':  
        console.log('next');  
        break;  
        }  
        }  
    })  
}  
// 关闭  
function hide(){  
    androidNotifi.hideNotifi();  
}  

由于Android播放视频没有通知栏控制.开始一直使用XZH-musicNotification 的插件,但是由于版本更新,出现BUG(插件已更新).
但是不能总等插件更新,就自己动动手写了一个Native.js版本,由于手上设备不多,没有测试更多的兼容性.在这里希望大家能勇于使用修改提出问题,完善此通知提示!
附件是线控耳机、蓝牙耳机按键监听插件(API >= 26,X86好像不支持忘了)

继续阅读 »

代码

const androidNotifi = {  
  NotifyID: 237,  
  receiver:null,  
  NotifiService:null,  
  serv: null,  
  intent: null,  
  mNotificationBuild: null,  
  mediaBtn: null,  
  channelID : '1',  
  channelName : '音乐通知',  
  notifiImg:{},  
  getImgTemp: function(audioImage) {  
    return new Promise(resolve => {  
      if (this.notifiImg[encodeURIComponent(audioImage)]) {  
        return resolve(plus.io.convertLocalFileSystemURL(this.notifiImg[encodeURIComponent(audioImage)]));  
      }  
      if(!/^http/.test(audioImage)) {  
        this.notifiImg[encodeURIComponent(audioImage)] = audioImage ? audioImage : '_www/static/image/notifimusic.png';  
        return resolve(plus.io.convertLocalFileSystemURL(audioImage ? audioImage : '_www/static/image/notifimusic.png'));  
      }  
      uni.downloadFile({  
        url: audioImage,  
        complete: res => {  
          this.notifiImg[encodeURIComponent(audioImage)] = res.tempFilePath ? res.tempFilePath : '_www/static/image/notifimusic.png';  
          return resolve(plus.io.convertLocalFileSystemURL(res.tempFilePath ? res.tempFilePath : '_www/static/image/notifimusic.png'));  
        }  
      });  
    });  
  },  
  hideNotifi: function(server = false){  
    this.main&&this.receiver&&this.main.unregisterReceiver(this.receiver);   
    server&&this.serv&&this.serv.stopForeground&&this.serv.stopForeground(this.NotifyID, this.mNotificationBuild) ;  
    if (Number(plus.os.version.split('.')[0])>= 8){     
      this.NotifiService&&this.NotifiService.cancel&&this.NotifiService.cancel(this.channelID,this.NotifyID);   
    } else {      
      this.NotifiService&&this.NotifiService.cancel&&this.NotifiService.cancel(this.NotifyID);   

    }   
    this.receiver = null;  
    this.NotifiService = null;  
    this.serv = null;  
    this.intent = null;  
    this.mNotificationBuild = null;  
    // this.NotifiService&&this.NotifiService.cancelAll&&this.NotifiService.cancelAll();  
    this.mediaBtn ? this.mediaBtn.release() : ''; // 线控销毁  
  },  
  showNotifi:async function(param) {  
    if (uni.$_sko.systemInfo.platform != 'android') {   
      return;  
    }  
    try{  
      param = Object.assign({  
        title : '通知标题',  
        subTitle: '',  
        cont : '通知内容',  
        isPlay: true, // 媒体播放按钮  
        legIcon : plus.io.convertLocalFileSystemURL('_www/static/image/notifimusic.png'),  
        Ongoing : false,    // 不可删除  
      },param);  
      this.main = this.main ? this.main : plus.android.runtimeMainActivity();    
      var Context = plus.android.importClass("android.content.Context");    
      var BitmapFactory = plus.android.importClass("android.graphics.BitmapFactory");    
      var NotificationManager = plus.android.importClass("android.app.NotificationManager");  
      var Notification = plus.android.importClass("android.app.Notification");;    
      var Intent = plus.android.importClass("android.content.Intent");    
      var PendingIntent = plus.android.importClass("android.app.PendingIntent");    
      var androidR = plus.android.importClass("android.R");    
      this.NotifiService = this.NotifiService ? this.NotifiService : this.main.getSystemService(Context.NOTIFICATION_SERVICE);    
      this.intent = this.intent ? this.intent : new Intent(this.main, this.main.getClass());    
      var UNI_MEDIA_BROAD = this.main.getPackageName() + '.mediaBtn';  

      //PendingIntent.getActivity的第二个参数需要设置为随机数,否则多个通知时会导致前面的通知被后面的通知替换Extra的数据    
      var pendingIntent = PendingIntent.getActivity(this.main, 0, this.intent, PendingIntent.FLAG_CANCEL_CURRENT);    
      var firstVersionNumber = Number(plus.os.version.split('.')[0]);    
      var mNotification;    
       //判断当前系统版本在8.0及以上    
      if (firstVersionNumber >= 8){  
          if (this.NotifiService.getNotificationChannel() == null){    
              var NotificationChannel = plus.android.importClass('android.app.NotificationChannel');    
              var channel = new NotificationChannel(this.channelID, this.channelName, NotificationManager.IMPORTANCE_HIGH);      
              this.NotifiService.createNotificationChannel(channel);      
              plus.android.autoCollection(NotificationChannel);  
          }    
          param.callBack&&this.main.startForegroundService(this.intent);  
          mNotification = new Notification.Builder(this.main, this.channelID);    
      } else {      
          mNotification = new Notification.Builder(this.main);      
          param.callBack&&this.main.startService(this.intent);  
      }      

      if(param.callBack) {  
        mNotification.addAction(androidR.drawable.ic_media_previous, "prev", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.prev'), PendingIntent.FLAG_CANCEL_CURRENT));  
        mNotification.addAction((param.isPlay ? androidR.drawable.ic_media_pause : androidR.drawable.ic_media_play), "play", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.play'), PendingIntent.FLAG_CANCEL_CURRENT));  
        mNotification.addAction(androidR.drawable.ic_media_next, "next", PendingIntent.getBroadcast(this.main, 0, new Intent().setAction(UNI_MEDIA_BROAD + '.next'), PendingIntent.FLAG_CANCEL_CURRENT));  
        var mMediaStyle = new Notification.MediaStyle();  
        mMediaStyle.setShowActionsInCompactView(0, 1, 2);  
        mNotification.setStyle(mMediaStyle);  
      }  
      mNotification.setOngoing(param.Ongoing);        
      param.legIcon&&mNotification.setLargeIcon(BitmapFactory.decodeFile(await this.getImgTemp(param.legIcon)));  
       mNotification.setSmallIcon(param.callBack?androidR.drawable.stat_sys_headset:androidR.drawable.stat_notify_chat); //设置图标    
       mNotification.setContentTitle(param.title);//设置标题  
       mNotification.setContentText(param.cont); //设置内容    
       param.subTitle&&mNotification.setSubText(param.subTitle);        //子内容暂时去掉    
       // mNotification.setAutoCancel(true);       //设置点击消失    
       //  mNotification.setShowWhen(true);         //显示通知时间    
       mNotification.setTicker("PadInfo");       //弹出通知    
       mNotification.setDefaults(Notification.DEFAULT_ALL);    
       // mNotification.setPriority(Notification.PRIORITY_DEFAULT);   //通知优先级      
       // mNotification.flags=Notification.FLAG_ONLY_ALERT_ONCE;     //发起通知时震动      
       mNotification.setContentIntent(pendingIntent);      

       this.mNotificationBuild = mNotification.build();  
       if (firstVersionNumber>= 8){      
         this.NotifiService.notify(this.channelID, this.NotifyID, this.mNotificationBuild);        
       } else {      
         this.NotifiService.notify(this.NotifyID, this.mNotificationBuild);      
       }   
       if(param.callBack) {  
          this.main&&this.receiver&&this.main.unregisterReceiver(this.receiver);   
          this.receiver = this.receiver ? this.receiver : plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {    
            onReceive: function(context, intent) { //实现onReceiver回调函数    
              param.callBack(intent.getAction().replace(UNI_MEDIA_BROAD + '.',''));    
            }    
          });   
        var IntentFilter = plus.android.importClass('android.content.IntentFilter');    
        var filter = new IntentFilter();    
        filter.addAction(UNI_MEDIA_BROAD + '.prev');  
        filter.addAction(UNI_MEDIA_BROAD + '.play');  
        filter.addAction(UNI_MEDIA_BROAD + '.next');  
        this.main.unregisterReceiver(this.receiver);  
        this.main.registerReceiver(this.receiver, filter); //注册监听    
        this.mediaBtn = uni.requireNativePlugin('uniMediaButton');  // 监听线控  需要配合附件中的插件( Android API >= 26)  
        this.mediaBtn.initMediaButton(res => {  
           console.log(res.message);  
          // 绑定失败/销毁  
          if(res.code == '-1') {  
            this.mediaBtn = null;  
            return;  
          }  
           // res.keyAction == 1 按键松开 res.keyAction == 0 按键按下 播放按钮肯能只有按下  
          if(res.keyCode && res.keyAction == '0') {  
            switch (res.keyCode){  
              case 88:  
                param.callBack(  
                  'prev'  
                );  
                break;  
              case 87:  
                param.callBack(  
                  'next'  
                );  
                break;  
              case 127:  
              case 126:  
                param.callBack(  
                  'play'  
                );  
                break;  
            }  
          }  
        });  
        var serv = plus.android.importClass("android.app.Service");  
        this.serv = this.serv ? this.serv : new serv();  
        this.serv.startForeground(this.NotifyID, this.mNotificationBuild);  
        plus.android.autoCollection(serv);  
        plus.android.autoCollection(IntentFilter);  
       }  
      plus.android.autoCollection(Context);  
      plus.android.autoCollection(BitmapFactory);  
      plus.android.autoCollection(NotificationManager);  
      plus.android.autoCollection(Notification);  
      plus.android.autoCollection(Intent);  
      plus.android.autoCollection(PendingIntent);  
      plus.android.autoCollection(androidR);  
      plus.android.autoCollection(this.receiver);  

    }catch(e){  
      console.log(e);  
    }  
  }  
};

使用方法

// 开启 - 更新标题/播放(暂停)按钮  
show();  
function show(){  
    androidNotifi.showNotifi({  
        title : '通知标题',  
        subTitle: '通知小标题',  
        cont : '通知内容',  
        isPlay: true, // 媒体播放按钮状态(控制播放/暂停按钮样式)  
        legIcon : '', // 封面图片  
        Ongoing : false,    // 是否可删除  
        callBack:function(res){  
            switch (res){  
            case 'play':  
        console.log('play');  
        break;  
        case 'prev':  
        console.log('prev');  
        break;  
        case 'next':  
        console.log('next');  
        break;  
        }  
        }  
    })  
}  
// 关闭  
function hide(){  
    androidNotifi.hideNotifi();  
}  

由于Android播放视频没有通知栏控制.开始一直使用XZH-musicNotification 的插件,但是由于版本更新,出现BUG(插件已更新).
但是不能总等插件更新,就自己动动手写了一个Native.js版本,由于手上设备不多,没有测试更多的兼容性.在这里希望大家能勇于使用修改提出问题,完善此通知提示!
附件是线控耳机、蓝牙耳机按键监听插件(API >= 26,X86好像不支持忘了)

收起阅读 »

银联云闪付小程序开发

云闪付小程序

分享一下我们开发的云闪付小程序PHP后端开发包,unionpay 云闪付小程序开发包

银联云闪付小程序非官方开发包,这可能是第一个支持composer导入的云闪付小程序开发包,小程序后端相关接口与支付相关接口已全部更新完毕。

码云地址:https://gitee.com/leapy/unionpay
Github地址:https://github.com/ileapy/unionpay

vue前端开发包(不建议这样引用)

> npm install upsdk-vue

有需要公众号和小程序开发的可以联系我,我们有团队:

邮箱:cfn@leapy.cn
微信:SH-CFN

继续阅读 »

分享一下我们开发的云闪付小程序PHP后端开发包,unionpay 云闪付小程序开发包

银联云闪付小程序非官方开发包,这可能是第一个支持composer导入的云闪付小程序开发包,小程序后端相关接口与支付相关接口已全部更新完毕。

码云地址:https://gitee.com/leapy/unionpay
Github地址:https://github.com/ileapy/unionpay

vue前端开发包(不建议这样引用)

> npm install upsdk-vue

有需要公众号和小程序开发的可以联系我,我们有团队:

邮箱:cfn@leapy.cn
微信:SH-CFN

收起阅读 »

在uniapp中使用Native.js 使用字节流读写文件工具类封装

/**

  • @description: gpb文件读写工具 采用Native.js
  • @author: Marco
  • @email: wtz_xupt@126.com
    */
    export default class GpbFileUtil {
    /**

    • 单例模式 获取实例
      */
      static getIntance(){
      if(!GpbFileUtil.instance){
      GpbFileUtil.instance = new GpbFileUtil()
      }

      return GpbFileUtil.instance
      }

      /**

    • 构造函数
      */
      constructor(){
      this.init()
      }

      /**

    • 初始化
      */
      init(){
      //导入类需要时间,统一导入提高效率
      this.main = plus.android.runtimeMainActivity()
      this.Environment = plus.android.importClass('android.os.Environment')
      this.File = plus.android.importClass('java.io.File')
      this.FileInputStream = plus.android.importClass("java.io.FileInputStream")
      this.FileOutputStream = plus.android.importClass('java.io.FileOutputStream')
      }

      /**

    • 判断有没有插入sdcard
      */
      checkSDCardExist(){
      if(this.Environment.getExternalStorageState() !== this.Environment.MEDIA_MOUNTED){
      return false
      }
      return true
      }

      /**

    • 获取sdcard根路径
      */
      getSDCardRoot(){
      return this.Environment.getExternalStorageDirectory()
      }

      /**

    • 判断sdcard 文件是否存在
    • @param {Object} filePath
    • @param {Object} fileName
      */
      checkSDCardFileExist(filePath,fileName){
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName
      let file = new this.File(fileFullPath)
      return file.exists()
      }

      /**

    • 删除sdcard中的文件
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
      */
      deleteSDCardFile(filePath,fileName){
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName

       let file = new this.File(fileFullPath)  
       if(file.exists()){  
           file.delete()  
       }  

      }

      /**

    • 读取sdcard中文件内容
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
      */
      readFileFromSDCard(filePath,fileName){
      if(!this.checkSDCardFileExist(filePath,fileName)){
      plus.nativeUI.toast(fileName + '文件不存在!')
      return;
      }
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName

      let file = new this.File(fileFullPath)

      let fis = new this.FileInputStream(file)

      let bytes = new Uint8Array(fis.available())
      try{
      let index = 0
      let byte
      while((byte = fis.read()) !== -1){
      bytes[index] = byte
      ++index
      }

      }catch(e){
      //TODO handle the exception
      console.log('读取sd文件' + fileName + '失败:' + e.message)
      }finally{
      try{
      if(fis !== null){
      fis.close()
      }
      }catch(ex){
      //TODO handle the exception
      console.log('关闭文件输入流失败:' + ex.message)
      }
      }

      return bytes
      }

      /**

    • 向sdcard中写文件
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
    • @param {Object} fileContentBytes 文件内容字节数组
      */
      writeFileToSDCard(filePath,fileName,fileContentBytes){
      this.deleteSDCardFile()
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName
      let file = new this.File(fileFullPath)
      let fos = new this.FileOutputStream(file)
      try{
      let index = 0
      while(index < fileContentBytes.length){
      fos.write(fileContentBytes[index])
      ++index
      }
      //fos.write(fileContentBytes) //java byte数组在nativejs中写入不了,只能循环一个一个字节写入
      fos.flush()
      }catch(e){
      //TODO handle the exception
      console.log('写入sd文件' + fileName + '失败:' + e.message)
      }finally{
      try{
      if(fos !== null){
      fos.close()
      }
      }catch(ex){
      //TODO handle the exception
      console.log('关闭文件输出流失败:' + ex.message)
      }
      }
      }

    }

在测试过程中nativejs 调用java FileInputStream read(byte []) 和write(byte []) 读取和写入不了。尝试循环后每次读取或写入一个字节成功了。

继续阅读 »

/**

  • @description: gpb文件读写工具 采用Native.js
  • @author: Marco
  • @email: wtz_xupt@126.com
    */
    export default class GpbFileUtil {
    /**

    • 单例模式 获取实例
      */
      static getIntance(){
      if(!GpbFileUtil.instance){
      GpbFileUtil.instance = new GpbFileUtil()
      }

      return GpbFileUtil.instance
      }

      /**

    • 构造函数
      */
      constructor(){
      this.init()
      }

      /**

    • 初始化
      */
      init(){
      //导入类需要时间,统一导入提高效率
      this.main = plus.android.runtimeMainActivity()
      this.Environment = plus.android.importClass('android.os.Environment')
      this.File = plus.android.importClass('java.io.File')
      this.FileInputStream = plus.android.importClass("java.io.FileInputStream")
      this.FileOutputStream = plus.android.importClass('java.io.FileOutputStream')
      }

      /**

    • 判断有没有插入sdcard
      */
      checkSDCardExist(){
      if(this.Environment.getExternalStorageState() !== this.Environment.MEDIA_MOUNTED){
      return false
      }
      return true
      }

      /**

    • 获取sdcard根路径
      */
      getSDCardRoot(){
      return this.Environment.getExternalStorageDirectory()
      }

      /**

    • 判断sdcard 文件是否存在
    • @param {Object} filePath
    • @param {Object} fileName
      */
      checkSDCardFileExist(filePath,fileName){
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName
      let file = new this.File(fileFullPath)
      return file.exists()
      }

      /**

    • 删除sdcard中的文件
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
      */
      deleteSDCardFile(filePath,fileName){
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName

       let file = new this.File(fileFullPath)  
       if(file.exists()){  
           file.delete()  
       }  

      }

      /**

    • 读取sdcard中文件内容
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
      */
      readFileFromSDCard(filePath,fileName){
      if(!this.checkSDCardFileExist(filePath,fileName)){
      plus.nativeUI.toast(fileName + '文件不存在!')
      return;
      }
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName

      let file = new this.File(fileFullPath)

      let fis = new this.FileInputStream(file)

      let bytes = new Uint8Array(fis.available())
      try{
      let index = 0
      let byte
      while((byte = fis.read()) !== -1){
      bytes[index] = byte
      ++index
      }

      }catch(e){
      //TODO handle the exception
      console.log('读取sd文件' + fileName + '失败:' + e.message)
      }finally{
      try{
      if(fis !== null){
      fis.close()
      }
      }catch(ex){
      //TODO handle the exception
      console.log('关闭文件输入流失败:' + ex.message)
      }
      }

      return bytes
      }

      /**

    • 向sdcard中写文件
    • @param {Object} filePath 文件路径
    • @param {Object} fileName 文件名称
    • @param {Object} fileContentBytes 文件内容字节数组
      */
      writeFileToSDCard(filePath,fileName,fileContentBytes){
      this.deleteSDCardFile()
      let fileFullPath = this.getSDCardRoot() + this.File.separator + filePath + this.File.separator + fileName
      let file = new this.File(fileFullPath)
      let fos = new this.FileOutputStream(file)
      try{
      let index = 0
      while(index < fileContentBytes.length){
      fos.write(fileContentBytes[index])
      ++index
      }
      //fos.write(fileContentBytes) //java byte数组在nativejs中写入不了,只能循环一个一个字节写入
      fos.flush()
      }catch(e){
      //TODO handle the exception
      console.log('写入sd文件' + fileName + '失败:' + e.message)
      }finally{
      try{
      if(fos !== null){
      fos.close()
      }
      }catch(ex){
      //TODO handle the exception
      console.log('关闭文件输出流失败:' + ex.message)
      }
      }
      }

    }

在测试过程中nativejs 调用java FileInputStream read(byte []) 和write(byte []) 读取和写入不了。尝试循环后每次读取或写入一个字节成功了。

收起阅读 »

Android平台各功能模块隐私合规协议

合规条款 隐私协议 合规

请根据App集成的功能模块补充相应模块的隐私协议

uni-app(5+、web2app)

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:15%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接/官网</th>
</tr>
<tr>
<td>uni-app(5+、web2app)</td>
<td>io.dcloud</td>
<td>基础模块</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG<br>
android.permission.READ_PHONE_STATE
</td>
<td>存储的个人文件,设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI),网络信息</td>
<td><a href="https://ask.dcloud.net.cn/protocol.html" target="_blank">https://ask.dcloud.net.cn/protocol.html</a></td>
</tr>
</table>

注意

  • 基础模块使用的权限说明及权限删减配置请参考文章Android平台云端打包权限配置
  • 离线打包请自行在AndroidManifest.xml中删减权限。
  • 关于READ_PHONE_STATE权限申请可根据权限策略文档配置屏蔽权限申请行为,具体请认真阅读文档!

uni-app默认集成功能模块

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:15%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接/官网</th>
</tr>
<tr>
<td>阿里weexSDK</td>
<td>com.taobao</td>
<td>uni-app基础模块默认集成,用于渲染uniapp的nvue页面引擎</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="https://weexapp.com/zh/" target="_blank">https://weexapp.com/zh/</a></td>
</tr>
<tr>
<td>Fresco图库</td>
<td>com.facebook.fresco</td>
<td>用于nvue页面加载图片使用</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="https://www.fresco-cn.org/" target="_blank">https://www.fresco-cn.org/</a></td>
</tr>
<tr>
<td>glide图库</td>
<td>com.bumptech.glide</td>
<td>用于图片预览使用</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="http://bumptech.github.io/glide/" target="_blank">http://bumptech.github.io/glide/</a></td>
</tr>
<tr>
<td>gif-drawable</td>
<td>pl.droidsonroids.gif</td>
<td>加载gif图</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储文件</td>
<td><a href="https://github.com/alibaba/fastjson" target="_blank">https://github.com/koral--/android-gif-drawable</a></td>
</tr>
<tr>
<td>fastjson</td>
<td>com.alibaba.fastjson</td>
<td>JSON解析</td>
<td style="font-size:12px">

</td>
<td>无</td>
<td><a href="https://github.com/alibaba/fastjson" target="_blank">https://github.com/alibaba/fastjson</a></td>
</tr>
<tr>
<td>移动安全联盟 OAID</td>
<td>com.bun.miitmdid、com.zui.opendeviceidlibrary、com.netease.nis、com.samsung.android、com.huawei.hms</td>
<td>获取oaid</td>
<td style="font-size:12px">

</td>
<td>设备信息</td>
<td><a href="http://www.msa-alliance.cn/col.jsp?id=122" target="_blank">http://www.msa-alliance.cn/col.jsp?id=122</a></td>
</tr>
</table>

关于移动安全联盟 OAID

移动智能终端补充设备标识体系与 SDK 隐私合规问题

移动智能终端补充设备标识体系与 SDK 严格遵守我国《网络安全法》、《数据安全法》和《电信和互联网用户个人信息保护规定》等相关法律法规和《信息安全技术 个人信息安全规范》等国家标准要求。SDK 不会主动收集任何数据,只在 APP 调用时获取以下数据,用于本地判断,不会进行任何网络传输:
­

  • 设备制造商、设备型号、设备品牌,用于判断终端调用接口
  • 设备网络运营商名称,用于判断虚拟机环境
  • APP 包名,用于校验签名

UniPush

<a id="push"></a>

UniPush是DCloud联合个推公司推出的集成型统一推送服务,使用了个推提供的SDK,因此需要在《隐私政策》中添加“个推消息推送SDK”相关说明。
建议《隐私政策》添加 “与授权合作伙伴共享”条款中,将 个推的用户隐私政策 加入其中,并向终端用户逐一明示您嵌入的SDK收集使用个人信息的目的、方式和范围。参考内容如下:

UniPush模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>个推·消息推送</td>
<td>com.igexin</td>
<td>消息推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.VIBRATE<br>
android.permission.GET_TASKS<br>
android.permission.QUERY_ALL_PACKAGES
</td>
<td>存储的个人文件、设备信息、网络信息(必选信息:设备平台、设备厂商、设备品牌、设备型号及系统版本、OAID、AndroidID、WIFI连接信息(SSID、BSSID)、运营商信息、DHCP;可选信息:IMEI、MAC、Google Advertising ID(GAID)、Serial Number、IMSI、ICCID、IP地址、基站信息)、位置相关信息、已安装应用列表</td>
<td><a href="http://docs.getui.com/privacy" target="_blank">http://docs.getui.com/privacy</a></td>
</tr>
</table>

注意:unipush 配置了华为厂商推送,需要添加HMS相关隐私协议 需要注意

HMS push

推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道。您通过集成推送服务,可以向客户端应用实时推送消息,因此需要在《隐私政策》中添加"HMS push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>华为 HMS push</td>
<td>com.huawei.hms</td>
<td>华为手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.FOREGROUND_SERVICE<br>
android.permission.READ_PHONE_STATE
</td>
<td>设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI)、应用已安装列表、网络信息</td>
<td><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/sdk-data-security-0000001050042177" target="_blank">推送隐私声明</a></td>
</tr>
</table>

魅族 Flyme push

魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族pushSDK的客户端实时地推送通知或者消息,与用户保持互动,提高活跃率,因此需要在《隐私政策》中添加"Flyme push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>魅族 Flyme push</td>
<td>com.meizu.cloud</td>
<td>魅族手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>网络信息、存储的个人文件</td>
<td><a href="http://static.meizu.com/resources/term/privacy8.html" target="_blank">推送隐私声明</a></td>
</tr>
</table>

OPPO push

推送服务(OPPO PUSH)是OPPO公司向开发者提供的消息推送服务,通过服务端与OS端建立的一条稳定、可靠的长连接通道,向OPPO手机系统(ColorOS)上的APP应用客户端实时推送消息的服务。无论应用进程是否存在,均可正常收到消息。因此需要在《隐私政策》中添加"OPPO push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>OPPO push</td>
<td>com.heytap</td>
<td>OPPO手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>网络信息</td>
<td><a href="https://open.oppomobile.com/new/developmentDoc/info?id=10288" target="_blank">推送隐私声明</a></td>
</tr>
</table>

vivo push

vivo推送(即Vpush)是vivo公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,支持百亿级的通知/消息推送,秒级触达移动用户,因此需要在《隐私政策》中添加"vivo push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>vivo push</td>
<td>com.vivo.push</td>
<td>vivo手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET
</td>
<td>网络信息</td>
<td><a href="https://dev.vivo.com.cn/documentCenter/doc/652#w1-12075822" target="_blank">推送隐私声明</a></td>
</tr>
</table>

小米 MiPush

小米推送(MiPush)是小米公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,有效地帮助开发者触达用户,提升App活跃度,因此需要在《隐私政策》中添加"小米 push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>MiPush</td>
<td>com.xiaomi.push</td>
<td>小米手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.VIBRATE
</td>
<td>网络信息</td>
<td><a href="https://dev.mi.com/distribute/doc/details?pId=1534" target="_blank">推送隐私声明</a></td>
</tr>
</table>

Statistic

<a id="statistic"></a>

HX3.1.14+ 友盟SDK已升级到9.3.8版本 适配合规问题

  • 当你集成了统计模块。您需要确保App有《隐私政策》,并且在用户首次启动App时就弹出《隐私政策》取得用户同意!!!
  • 您务必告知用户您选择友盟+SDK服务,请在《隐私政策》中增加如下参考条款:“我们的产品集成友盟+SDK,友盟+SDK需要收集您的设备Mac地址、唯一设备识别码(IMEI/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息)以提供统计分析服务,并通过地理位置校准报表数据准确性,提供基础反作弊能力。”
  • 您务必确保用户同意《隐私政策》之后。再调用相关api!!!!

Statistic模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>友盟统计</td>
<td>com.uc.crashsdk、com.efs、com.umeng</td>
<td>统计(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE
</td>
<td>设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI)、应用已安装列表、网络信息</td>
<td><a href="https://www.umeng.com/page/policy" target="_blank">https://www.umeng.com/page/policy</a></td>
</tr>
</table>

OAuth、Share、Payment

<a id="oauth"/>
<a id="payment"/>
<a id="share"/>
登录、分享、支付存在引入相同SDK,这里统一进行说明:

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>微信开放平台</td>
<td>com.tencent.mm</td>
<td>登录、分享、支付(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、网络信息</td>
<td><a href="https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy" target="_blank">微信隐私协议</a></td>
</tr>
<tr>
<td>新浪开放平台</td>
<td>com.sina.weibo</td>
<td>登录、分享(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、网络信息</td>
<td><a href="https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1" target="_blank">新浪隐私协议</a></td>
</tr>
<tr>
<td>QQ开放平台</td>
<td>com.tencent.open</td>
<td>登录、分享(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.MODIFY_AUDIO_SETTINGS<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://wiki.connect.qq.com/qq%e4%ba%92%e8%81%94sdk%e9%9a%90%e7%a7%81%e4%bf%9d%e6%8a%a4%e5%a3%b0%e6%98%8e" target="_blank">qq隐私协议</a></td>
</tr>
<tr>
<td>支付宝开放平台</td>
<td>com.alipay</td>
<td>支付(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>网络信息 设备id IP地址 OAID IMSI</td>
<td><a href="https://render.alipay.com/p/c/k2cx0tg8" target="_blank">支付宝隐私协议</a></td>
</tr>
</table>

一键登录

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>个验一键登录</td>
<td>com.g.elogin、com.g.gysdk、cn.com.chinatelecom</td>
<td>登录(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.READ_PHONE_STATE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_NETWORK_STATE
</td>
<td>设备信息、网络信息(必选信息:设备平台、设备厂商、设备品牌、设备型号及系统版本、OAID、AndroidID、WIFI连接信息(SSID、BSSID)、运营商信息、DHCP、IP地址、去标识化的手机号码;可选信息:IMEI、MAC、Google Advertising ID(GAID)、Serial Number、IMSI、ICCID、基站信息)、存储的个人文件、读取手机状态和身份、位置相关信息、已安装应用列表</td>
<td> <a href="https://docs.getui.com/privacy/" target="_blank">个验</a> <br><a href="https://wap.cmpassport.com/resources/html/contract.html" target="_blank">中国移动认证服务条款</a><br>
<a href="https://opencloud.wostore.cn/authz/resource/html/disclaimer.html?fromsdk=true" target="_blank">联通统一认证服务条款</a>
</td>
</tr>
</table>

一键登录包含以下登录认证需要在隐私协议中补充

Speech

<a id="speech"/>
Speech模块集成的三方SDK说明

百度语音

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>百度语音识别</td>
<td>com.baidu.speech</td>
<td>语音识别(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.RECORD_AUDIO<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_NETWORK_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3" target="_blank">https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3</a></td>
</tr>
</table>

Map & Geolocation

<a id="map-amp-geolocation"/>
Map & Geolocation模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>高德开放平台</td>
<td>com.amap.api, com.loc, com.autonavi</td>
<td>实现定位/展现地图(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
</td>
<td>存储的个人文件、位置信息、读取手机状态和身份、网络信息、传感器信息、Android ID</td>
<td><a href="https://lbs.amap.com/pages/privacy/" target="_blank">https://lbs.amap.com/pages/privacy/</a></td>
</tr>
<tr>
<td>百度开放平台</td>
<td>com.baidu</td>
<td>实现定位/展现地图(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS<br>
android.permission.READ_LOGS<br>
android.permission.WRITE_SETTINGS<br>
android.permission.MOUNT_UNMOUNT_FILESYSTEM
</td>
<td>存储的个人文件、位置信息、读取手机状态和身份、网络信息</td>
<td><a href="https://map.baidu.com/zt/client/privacy/index.html" target="_blank">https://map.baidu.com/zt/client/privacy/index.html</a></td>
</tr>
</table>

注意

  • 关于高德SDK在后台收集个人信息的问题,请在《隐私政策》中参考补充如下条款:我们的产品集成了高德SDK,应用在后台状态下高德SDK可能会收集设备标识信息(Android ID)以支持在后台继续提供相关服务。

uni-ad

<a id="uniAd"/>

uni-ad广告模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:8%">SDK名称</th>
<th style="width:10%">SDK包名/网址</th>
<th style="width:8%">SDK用途</th>
<th style="width:20%">可能获取的个人信息类型</th>
<th style="width:25%">调用的设备权限</th>
<th style="width:20%">信息用途</th>
<th style="width:10%">SDK隐私政策链接/目的</th>
</tr>
<tr>
<td>uni-ad</td>
<td></td>
<td>基础广告 </td>
<td style="font-size:12px">设备品牌、型号、操作系统版本、OAID、分辨率、IMEI、android ID、SIM 卡 IMSI 信息、应用名称、应用包名、应用版本号、网络信息、应用安装列表、位置信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td>广告投放合作,广告归因、反作弊、安全 </td>
<td><a href="https://doc.dcloud.net.cn/markdown-share-docs/1d821cdd3cdf2681045ec4be94bc8404/" target="_blank">隐私协议</a></td>
</tr>
<tr>
<td>推啊 </td>
<td> engine.tuifish.com </td>
<td>基础广告 </td>
<td style="font-size:12px">设备品牌、型号、操作系统版本、OAID、分辨率、IMEI、android ID、SIM 卡 IMSI 信息、应用名称、应用包名、应用版本号、网络信息、应用安装列表、位置信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td style="font-size:12px">识别广告、活动作弊行为;改善 SDK 崩溃率、推送个性化广告;广告投放。 </td>
<td><a href= "https://yun.tuia.cn/tuia/sdk/agreement/index.html" target="_blank">推啊隐私协议</a></td>
</tr>
<tr>
<td>快手 </td>
<td>com.kwad.sdk </td>
<td>增强广告 </td>
<td>基础信息:设备品牌、设备型号、软件系统版本、存储信息、运营商信息、设备时区、设备语言、网络信息等基础信息</br>
设备标识:IMEIs、MEID、OAID、AndroidID、IMSIs、ICCID</br>
位置信息:IP地址、MAC地址、GPS位置信息、基站信息、WIFI信息</br>
应用信息:应用安装列表</br>
其他信息:传感器信息、sim卡激活信息</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.INTERNET <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.VIBRATE
</td>
<td>广告投放、广告归因、反作弊、安全 </td>
<td><a href="https://www.kuaishou.com/about/policy" target="_blank">快手内容联盟隐私协议</a>和<a href="https://u.kuaishou.com/home/detail/1220" target="_blank">SDK使用规范</a></td>
</tr>
<tr>
<td>快手内容联盟 </td>
<td>com.kwad.sdk </td>
<td>增强广告 </td>
<td>基础信息:设备品牌、设备型号、软件系统版本、存储信息、运营商信息、设备时区、设备语言、网络信息等基础信息</br>
设备标识:IMEIs、MEID、OAID、AndroidID、IMSIs、ICCID</br>
位置信息:IP地址、MAC地址、GPS位置信息、基站信息、WIFI信息</br>
应用信息:应用安装列表</br>
其他信息:传感器信息、sim卡激活信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.INTERNET <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.VIBRATE <br>
android.permission.SET_WALLPAPER<br>
android.permission.READ_EXTERNAL_STORAGE <br>
android.permission.WRITE_EXTERNAL_STORAGE <br>
android.permission.ACCESS_COARSE_LOCATION <br>
android.permission.BLUETOOTH
</td>
<td>广告投放、广告归因、反作弊、安全 </td>
<td><a href="https://www.kuaishou.com/about/policy" target="_blank">快手内容联盟隐私协议</a>和<a href="https://u.kuaishou.com/home/detail/1220" target="_blank">SDK使用规范</a></td>
</tr>
<tr>
<td>优量汇 </td>
<td>com.qq.e </td>
<td>增强广告 </td>
<td>基站、附近的WIFI、连接的WIFI、位置信息、设备制造商、设备型号、操作系统版本、屏幕分辨率、屏幕方向、屏幕DPI、IP地址、加速度传感器、磁场传感器、OAID、IMEI/MEID(Device ID)、Android_ID、包名、版本号、进程名称、运行状态、可疑行为、应用安装信息 </td>
<td style="font-size:12px">
android.permission.INTERNET <br>
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.CHANGE_NETWORK_STATE<br>
android.permission.QUERY_ALL_PACKAGES <br>
android.permission.REORDER_TASKS<br>
android.permission.VIBRATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td style="font-size:12px">广告投放与监测归因、广告主统计投放结果、减少App崩溃、确保服务器正常运行、提升可扩展性和性能</td>
<td><a href="https://e.qq.com/dev/help_detail.html?cid=2005&pid=5983" target="_blank">优量汇隐私协议</a></td>
</tr>
<tr>
<td>穿山甲 </td>
<td>com.bytedance.sdk.openadsdk</td>
<td>增强广告 </td>
<td>设备品牌、型号、软件系统版本、屏幕密度、屏幕分辨率、设备语言、设备时区、sim卡信息(mcc&mnc)、CPU信息、可用存储空间大小、MAC地址、设备标识符(如IMEI、IMSI、ICCID、GAID(仅GMS服务)、MEID、硬件序列号build_serial、AndroidID、OAID、运营商信息、Wi-Fi状态、网络信号强度、IP地址、应用包名、运行中的进程信息、版本号、应用前后台状态、软件列表信息、线性加速度传感器、磁场传感器、旋转矢量传感器、精确位置信息、粗略位置信息(WiFi列表、WLAN接入点(如SSID,BSSID)、基站) </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>广告投放合作、广告归因、反作弊 </td>
<td><a href="https://www.pangle.cn/privacy/partner" target="_blank">穿山甲隐私协议</a></td>
</tr>
<tr>
<td>Sigmob </td>
<td>com.sigmob.windad </td>
<td>增强广告 </td>
<td>设备信息:设备品牌、型号、操作系统版本、OAID、分辨率等基础设备信息
应用信息:应用名称、应用包名、应用版本号等
其他:运营商信息、时区</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.INTERNET <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.CHANGE_WIFI_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.QUERY_ALL_PACKAGES
</td>
<td>广告投放、广告主归因、反作弊 </td>
<td><a href="https://doc.sigmob.com/Sigmob%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E5%90%88%E8%A7%84%E6%9D%A1%E6%AC%BE/%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96/">Sigmob隐私协议</a></td>
</tr>
<tr>
<td>百度百青藤</td>
<td>com.baidu.mobads.proxy </td>
<td>增强广告 </td>
<td>设备信息:设备品牌、型号、软件系统版本、分辨率、网络信号强度、传感器信息,磁盘总空间、系统总内存空间、手机重启信息、手机系统更新时间等基础信息、OAID、AndroidID、屏幕宽高,屏幕像素密度,系统版本号,设备厂商,设备型号,手机运营商,手机网络状态,设备剩余存储空间,手机重启时间和更新时间
开发者应用信息:应用包名、应用前后台状态
设备信息:IMEI、IMSI、MEID
位置信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.ACCESS_COARSE_LOCATION<br>
android.permissio.WRITE_EXTERNAL_STORAGE<br>
</td>
<td>为最终用户提供安全保障、改善我们的产品和服务,开展内部审计、数据分析和研究 </td>
<td><a href="https://union.baidu.com/bqt/#/legal/policies">百度百青藤隐私协议</a></td>
</tr>

<tr>
<td>HUAWEI Ads</td>
<td>com.huawei.hms.ads.lite</td>
<td>增强广告 </td>
<td>设备信息、网络信息、位置信息、应用信息、应用使用信息、上下文信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
</td>
<td>单次请求的广告定向投放、程序化广告投放、广告监测归因与反作弊。</td>
<td><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/whale-hong-kinetic-energy-sdk-privacy-statement-0000001658283582">HUAWEI Ads 隐私声明</a><br><br>和<br><br><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/whale-hong-kinetic-sdk-compliance-user-guide-0000001658442922">HUAWEI Ads SDK隐私安全说明</a></td>
</tr>

<tr>
<td>章鱼广告</td>
<td>com.octopus.ad</td>
<td>增强广告 </td>
<td>设备品牌、设备型号、设备时区、设备语言、系统版本、开发者应用名、应用版本号、应用包名、网络类型、UserAgent信息、网络状态、崩溃信息、性能数据、屏幕高宽、屏幕方向、屏幕DPI信息、系统更新时间、开机时间、磁盘空间、物理内存、设备ID(OAID、GAID)、IMEI 用户授权才收集、USB调试模式、cpu、运行状态、运营商、传感器信息、掠过手势内容</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
</td>
<td>基于用户设备信息调整广告投放、统计分析、反作弊、实现广告正常显示与交互功能,通过崩溃信息,以此来优化代码缺陷,最大程度减少App崩溃。通过收集SDK运行过程中性能数据,以优化SDK的性能。统计广告数据,以用于广告主统计投放结果。</td>
<td><a href="https://doc.adintl.cn/#/zh-cn/guide/UsePrivacy">章鱼广告SDK隐私政策</a></td>
</tr>

<tr>
<td>倍孜广告</td>
<td>com.beizi.ad</td>
<td>增强广告 </td>
<td>设备品牌、设备型号、设备时区、设备语言、系统版本、网络类型、UserAgent信息、屏幕高宽、屏幕方向、屏幕DPI信息、系统更新时间、开机时间、磁盘空间、物理内存、运营商、sim卡状态、传感器信息、掠过手势内容、cpu、设备ID(国内用户OAID、海外用户GAID)、开发者应用名、应用版本号、应用包名、运行状态、使用数据、诊断数据</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
</td>
<td>广告投放策略、统计分析服务、反作弊分析、广告正常显示与交互功能的实现、广告归因、最大程度减少App崩溃、确保服务器正常运行、提升可扩展性和性能</td>
<td><a href="https://sdkdoc.beizi.biz/#/zh-cn/guide/UsePrivacy">BeiZi SDK隐私保护声明</a></td>
</tr>

<tr>
<td>泛连</td>
<td>com.fl.saas.s2s</td>
<td>增强广告 </td>
<td>设备品牌、型号、软件系统版本、屏幕密度、屏幕分辨率、设备语言、设备时区、IMEI、IMSI、ICCID、GAID、MEID、IDFA、IDFV、AndroidID、OAID、手机系统重启时间、设备的MAC地址、User Agent、IP地址、运营商信息、Wi-Fi状态、网络信号强度、应用版本、应用包名、应用名称、应用前后台状态、应用列表信息、加速度传感器、陀螺仪传感器、广告的展示、点击及转化等交互数据、系统崩溃数据、性能数据</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.VIBRATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.READ_PHONE_STATE<br/>
</td>
<td>广告投放及广告监测归因、反作弊、摇一摇广告投放、广告投放统计分析、提升SDK的稳定性,减少APP的崩溃</td>
<td><a href="https://www.adfunlink.com/doc/privacy.html">Funlink隐私保护声明</a></td>
</tr>

<tr>
<td>聚力阅盟</td>
<td>com.dcloudym</td>
<td>增强广告 </td>
<td>设备型号、操作系统版本、唯一设备标识符、设备环境等软硬件特征信息;GPS位置以及WLAN接入点、蓝牙和基站等传感器信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.VIBRATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.READ_PHONE_STATE<br/>
android.permission.WRITE_EXTERNAL_STORAGE<br/>
android.permission.ACCESS_COARSE_LOCATION<br/>
android.permission.ACCESS_FINE_LOCATION<br/>
</td>
<td>广告投放及广告监测归因、反作弊、摇一摇广告投放</td>
<td><a href="https://idbj.juliyuemeng.com/privacy">聚力阅盟隐私保护声明</a></td>
</tr>
</table>

腾讯x5内核

<a id="e885bee8aeafx5e58685e6a0b8"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>腾讯浏览服务SDK</td>
<td>com.tencent.tbs、com.tencent.smtt</td>
<td>x5内核渲染webview(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://x5.tencent.com/docs/privacy.html" target="_blank">https://x5.tencent.com/docs/privacy.html</a></td>
</tr>
</table>

Contacts

<a id="Contacts"/>

管理系统通讯录,用于可对系统通讯录进行增、删、改、查等操作。通过plus.contacts获取系统通讯录管理对象。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Contacts</td>
<td>io.dcloud.feature.contacts</td>
<td>管理系统通讯录,用于可对系统通讯录进行增、删、改、查等操作(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.GET_ACCOUNTS<br>
android.permission.WRITE_CONTACTS<br>
android.permission.READ_CONTACTS
</td>
<td>获取联系人信息</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

Messaging

<a id="Messaging"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Messaging</td>
<td>io.dcloud.feature.messagings</td>
<td>管理设备通讯功能,可用于短信、彩信、邮件发送等(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.RECEIVE_SMS<br>
android.permission.SEND_SMS<br>
android.permission.WRITE_SMS<br>
android.permission.READ_SMS
</td>
<td>读写短信、彩信、邮件</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

Bluetooth(低功耗蓝牙)

<a id="Bluetooth"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Bluetooth</td>
<td>io.dcloud.feature.bluetooth</td>
<td>访问蓝牙设备,包括搜索、连接。(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.BLUETOOTH<br>
android.permission.BLUETOOTH_ADMIN<br><br>
以下两种权限在targetSdkVersion31及以上才需要!<br>
android.permission.BLUETOOTH_SCAN<br>
android.permission.BLUETOOTH_CONNECT
</td>
<td>访问蓝牙设备、位置信息。</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

FacialRecognitionVerify(实人认证)

<a id="FacialRecognitionVerify"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>实人认证</td>
<td>com.dtf.face.verify</td>
<td>实人认证服务搭载真人检测和人脸比对等生物识别技术,配合权威数据源验证,可快速校验自然人的真实身份。</td>
<td style="font-size:12px">
android.permission.READ_PHONE_STATE<br>
android.permission.INTERNET<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.CAMERA<br>
</td>
<td>设备信息、最终用户上传的语音、图片信息、终端权限信息、日志信息</td>
<td style="font-size:12px"><a href="https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202107281509_18386.html" target="_blank">https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202107281509_18386.html</a></td>
</tr>
</table>

如果您的应用使用了依赖三方SDK的模块也需要将其合规条款添加到《隐私政策》中

uni原生插件

如果应用使用了uni原生插件,需要注意一下几点:

  • 使用插件时请查看插件详情页面中的 隐私、权限声明 。(插件使用什么sdk?获取了什么用户信息?都应由插件作者提供并填写在 隐私、权限声明中)
  • 将插件中用到的三方SDK信息添加到用户隐私协议中。例如集成了百度定位。就需要在隐私协议中说明集成了百度定位SDK。获取了xxx用户信息!用于xxx.
  • 如果发现插件有获取用户信息而插件详情页并没有提供隐私、权限声明,请与插件开发者或与我们反馈共同督促进行补充。

其它

《隐私政策》必须非常清楚、全面地说明(不要用可能收集、了解用户信息这种模糊不清晰的词语)收集用户个人信息的目的、方式和范围。
如果应用使用“通讯录”、“短信”等相关功能,请根据应用业务场景进行描述。

继续阅读 »

请根据App集成的功能模块补充相应模块的隐私协议

uni-app(5+、web2app)

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:15%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接/官网</th>
</tr>
<tr>
<td>uni-app(5+、web2app)</td>
<td>io.dcloud</td>
<td>基础模块</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG<br>
android.permission.READ_PHONE_STATE
</td>
<td>存储的个人文件,设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI),网络信息</td>
<td><a href="https://ask.dcloud.net.cn/protocol.html" target="_blank">https://ask.dcloud.net.cn/protocol.html</a></td>
</tr>
</table>

注意

  • 基础模块使用的权限说明及权限删减配置请参考文章Android平台云端打包权限配置
  • 离线打包请自行在AndroidManifest.xml中删减权限。
  • 关于READ_PHONE_STATE权限申请可根据权限策略文档配置屏蔽权限申请行为,具体请认真阅读文档!

uni-app默认集成功能模块

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:15%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接/官网</th>
</tr>
<tr>
<td>阿里weexSDK</td>
<td>com.taobao</td>
<td>uni-app基础模块默认集成,用于渲染uniapp的nvue页面引擎</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="https://weexapp.com/zh/" target="_blank">https://weexapp.com/zh/</a></td>
</tr>
<tr>
<td>Fresco图库</td>
<td>com.facebook.fresco</td>
<td>用于nvue页面加载图片使用</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="https://www.fresco-cn.org/" target="_blank">https://www.fresco-cn.org/</a></td>
</tr>
<tr>
<td>glide图库</td>
<td>com.bumptech.glide</td>
<td>用于图片预览使用</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储的个人文件</td>
<td><a href="http://bumptech.github.io/glide/" target="_blank">http://bumptech.github.io/glide/</a></td>
</tr>
<tr>
<td>gif-drawable</td>
<td>pl.droidsonroids.gif</td>
<td>加载gif图</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAG
</td>
<td>存储文件</td>
<td><a href="https://github.com/alibaba/fastjson" target="_blank">https://github.com/koral--/android-gif-drawable</a></td>
</tr>
<tr>
<td>fastjson</td>
<td>com.alibaba.fastjson</td>
<td>JSON解析</td>
<td style="font-size:12px">

</td>
<td>无</td>
<td><a href="https://github.com/alibaba/fastjson" target="_blank">https://github.com/alibaba/fastjson</a></td>
</tr>
<tr>
<td>移动安全联盟 OAID</td>
<td>com.bun.miitmdid、com.zui.opendeviceidlibrary、com.netease.nis、com.samsung.android、com.huawei.hms</td>
<td>获取oaid</td>
<td style="font-size:12px">

</td>
<td>设备信息</td>
<td><a href="http://www.msa-alliance.cn/col.jsp?id=122" target="_blank">http://www.msa-alliance.cn/col.jsp?id=122</a></td>
</tr>
</table>

关于移动安全联盟 OAID

移动智能终端补充设备标识体系与 SDK 隐私合规问题

移动智能终端补充设备标识体系与 SDK 严格遵守我国《网络安全法》、《数据安全法》和《电信和互联网用户个人信息保护规定》等相关法律法规和《信息安全技术 个人信息安全规范》等国家标准要求。SDK 不会主动收集任何数据,只在 APP 调用时获取以下数据,用于本地判断,不会进行任何网络传输:
­

  • 设备制造商、设备型号、设备品牌,用于判断终端调用接口
  • 设备网络运营商名称,用于判断虚拟机环境
  • APP 包名,用于校验签名

UniPush

<a id="push"></a>

UniPush是DCloud联合个推公司推出的集成型统一推送服务,使用了个推提供的SDK,因此需要在《隐私政策》中添加“个推消息推送SDK”相关说明。
建议《隐私政策》添加 “与授权合作伙伴共享”条款中,将 个推的用户隐私政策 加入其中,并向终端用户逐一明示您嵌入的SDK收集使用个人信息的目的、方式和范围。参考内容如下:

UniPush模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>个推·消息推送</td>
<td>com.igexin</td>
<td>消息推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.VIBRATE<br>
android.permission.GET_TASKS<br>
android.permission.QUERY_ALL_PACKAGES
</td>
<td>存储的个人文件、设备信息、网络信息(必选信息:设备平台、设备厂商、设备品牌、设备型号及系统版本、OAID、AndroidID、WIFI连接信息(SSID、BSSID)、运营商信息、DHCP;可选信息:IMEI、MAC、Google Advertising ID(GAID)、Serial Number、IMSI、ICCID、IP地址、基站信息)、位置相关信息、已安装应用列表</td>
<td><a href="http://docs.getui.com/privacy" target="_blank">http://docs.getui.com/privacy</a></td>
</tr>
</table>

注意:unipush 配置了华为厂商推送,需要添加HMS相关隐私协议 需要注意

HMS push

推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道。您通过集成推送服务,可以向客户端应用实时推送消息,因此需要在《隐私政策》中添加"HMS push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>华为 HMS push</td>
<td>com.huawei.hms</td>
<td>华为手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.FOREGROUND_SERVICE<br>
android.permission.READ_PHONE_STATE
</td>
<td>设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI)、应用已安装列表、网络信息</td>
<td><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/sdk-data-security-0000001050042177" target="_blank">推送隐私声明</a></td>
</tr>
</table>

魅族 Flyme push

魅族推送服务是由魅族公司为开发者提供的消息推送服务,开发者可以向集成了魅族pushSDK的客户端实时地推送通知或者消息,与用户保持互动,提高活跃率,因此需要在《隐私政策》中添加"Flyme push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>魅族 Flyme push</td>
<td>com.meizu.cloud</td>
<td>魅族手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>网络信息、存储的个人文件</td>
<td><a href="http://static.meizu.com/resources/term/privacy8.html" target="_blank">推送隐私声明</a></td>
</tr>
</table>

OPPO push

推送服务(OPPO PUSH)是OPPO公司向开发者提供的消息推送服务,通过服务端与OS端建立的一条稳定、可靠的长连接通道,向OPPO手机系统(ColorOS)上的APP应用客户端实时推送消息的服务。无论应用进程是否存在,均可正常收到消息。因此需要在《隐私政策》中添加"OPPO push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>OPPO push</td>
<td>com.heytap</td>
<td>OPPO手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>网络信息</td>
<td><a href="https://open.oppomobile.com/new/developmentDoc/info?id=10288" target="_blank">推送隐私声明</a></td>
</tr>
</table>

vivo push

vivo推送(即Vpush)是vivo公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,支持百亿级的通知/消息推送,秒级触达移动用户,因此需要在《隐私政策》中添加"vivo push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>vivo push</td>
<td>com.vivo.push</td>
<td>vivo手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET
</td>
<td>网络信息</td>
<td><a href="https://dev.vivo.com.cn/documentCenter/doc/652#w1-12075822" target="_blank">推送隐私声明</a></td>
</tr>
</table>

小米 MiPush

小米推送(MiPush)是小米公司向开发者提供的消息推送服务,通过在云端与客户端之间建立一条稳定、可靠的长连接,为开发者提供向客户端应用实时推送消息的服务,有效地帮助开发者触达用户,提升App活跃度,因此需要在《隐私政策》中添加"小米 push"相关说明。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>MiPush</td>
<td>com.xiaomi.push</td>
<td>小米手机厂商推送(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.VIBRATE
</td>
<td>网络信息</td>
<td><a href="https://dev.mi.com/distribute/doc/details?pId=1534" target="_blank">推送隐私声明</a></td>
</tr>
</table>

Statistic

<a id="statistic"></a>

HX3.1.14+ 友盟SDK已升级到9.3.8版本 适配合规问题

  • 当你集成了统计模块。您需要确保App有《隐私政策》,并且在用户首次启动App时就弹出《隐私政策》取得用户同意!!!
  • 您务必告知用户您选择友盟+SDK服务,请在《隐私政策》中增加如下参考条款:“我们的产品集成友盟+SDK,友盟+SDK需要收集您的设备Mac地址、唯一设备识别码(IMEI/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息)以提供统计分析服务,并通过地理位置校准报表数据准确性,提供基础反作弊能力。”
  • 您务必确保用户同意《隐私政策》之后。再调用相关api!!!!

Statistic模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>友盟统计</td>
<td>com.uc.crashsdk、com.efs、com.umeng</td>
<td>统计(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE
</td>
<td>设备信息(IMEI、ANDROID_ID、DEVICE_ID、IMSI)、应用已安装列表、网络信息</td>
<td><a href="https://www.umeng.com/page/policy" target="_blank">https://www.umeng.com/page/policy</a></td>
</tr>
</table>

OAuth、Share、Payment

<a id="oauth"/>
<a id="payment"/>
<a id="share"/>
登录、分享、支付存在引入相同SDK,这里统一进行说明:

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>微信开放平台</td>
<td>com.tencent.mm</td>
<td>登录、分享、支付(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、网络信息</td>
<td><a href="https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy" target="_blank">微信隐私协议</a></td>
</tr>
<tr>
<td>新浪开放平台</td>
<td>com.sina.weibo</td>
<td>登录、分享(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、网络信息</td>
<td><a href="https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1" target="_blank">新浪隐私协议</a></td>
</tr>
<tr>
<td>QQ开放平台</td>
<td>com.tencent.open</td>
<td>登录、分享(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.MODIFY_AUDIO_SETTINGS<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://wiki.connect.qq.com/qq%e4%ba%92%e8%81%94sdk%e9%9a%90%e7%a7%81%e4%bf%9d%e6%8a%a4%e5%a3%b0%e6%98%8e" target="_blank">qq隐私协议</a></td>
</tr>
<tr>
<td>支付宝开放平台</td>
<td>com.alipay</td>
<td>支付(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE
</td>
<td>网络信息 设备id IP地址 OAID IMSI</td>
<td><a href="https://render.alipay.com/p/c/k2cx0tg8" target="_blank">支付宝隐私协议</a></td>
</tr>
</table>

一键登录

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>个验一键登录</td>
<td>com.g.elogin、com.g.gysdk、cn.com.chinatelecom</td>
<td>登录(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.READ_PHONE_STATE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_NETWORK_STATE
</td>
<td>设备信息、网络信息(必选信息:设备平台、设备厂商、设备品牌、设备型号及系统版本、OAID、AndroidID、WIFI连接信息(SSID、BSSID)、运营商信息、DHCP、IP地址、去标识化的手机号码;可选信息:IMEI、MAC、Google Advertising ID(GAID)、Serial Number、IMSI、ICCID、基站信息)、存储的个人文件、读取手机状态和身份、位置相关信息、已安装应用列表</td>
<td> <a href="https://docs.getui.com/privacy/" target="_blank">个验</a> <br><a href="https://wap.cmpassport.com/resources/html/contract.html" target="_blank">中国移动认证服务条款</a><br>
<a href="https://opencloud.wostore.cn/authz/resource/html/disclaimer.html?fromsdk=true" target="_blank">联通统一认证服务条款</a>
</td>
</tr>
</table>

一键登录包含以下登录认证需要在隐私协议中补充

Speech

<a id="speech"/>
Speech模块集成的三方SDK说明

百度语音

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>百度语音识别</td>
<td>com.baidu.speech</td>
<td>语音识别(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.RECORD_AUDIO<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_NETWORK_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3" target="_blank">https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3</a></td>
</tr>
</table>

Map & Geolocation

<a id="map-amp-geolocation"/>
Map & Geolocation模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>高德开放平台</td>
<td>com.amap.api, com.loc, com.autonavi</td>
<td>实现定位/展现地图(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
</td>
<td>存储的个人文件、位置信息、读取手机状态和身份、网络信息、传感器信息、Android ID</td>
<td><a href="https://lbs.amap.com/pages/privacy/" target="_blank">https://lbs.amap.com/pages/privacy/</a></td>
</tr>
<tr>
<td>百度开放平台</td>
<td>com.baidu</td>
<td>实现定位/展现地图(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.CHANGE_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS<br>
android.permission.READ_LOGS<br>
android.permission.WRITE_SETTINGS<br>
android.permission.MOUNT_UNMOUNT_FILESYSTEM
</td>
<td>存储的个人文件、位置信息、读取手机状态和身份、网络信息</td>
<td><a href="https://map.baidu.com/zt/client/privacy/index.html" target="_blank">https://map.baidu.com/zt/client/privacy/index.html</a></td>
</tr>
</table>

注意

  • 关于高德SDK在后台收集个人信息的问题,请在《隐私政策》中参考补充如下条款:我们的产品集成了高德SDK,应用在后台状态下高德SDK可能会收集设备标识信息(Android ID)以支持在后台继续提供相关服务。

uni-ad

<a id="uniAd"/>

uni-ad广告模块集成的三方SDK说明

<table style="word-break:break-all">
<tr>
<th style="width:8%">SDK名称</th>
<th style="width:10%">SDK包名/网址</th>
<th style="width:8%">SDK用途</th>
<th style="width:20%">可能获取的个人信息类型</th>
<th style="width:25%">调用的设备权限</th>
<th style="width:20%">信息用途</th>
<th style="width:10%">SDK隐私政策链接/目的</th>
</tr>
<tr>
<td>uni-ad</td>
<td></td>
<td>基础广告 </td>
<td style="font-size:12px">设备品牌、型号、操作系统版本、OAID、分辨率、IMEI、android ID、SIM 卡 IMSI 信息、应用名称、应用包名、应用版本号、网络信息、应用安装列表、位置信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td>广告投放合作,广告归因、反作弊、安全 </td>
<td><a href="https://doc.dcloud.net.cn/markdown-share-docs/1d821cdd3cdf2681045ec4be94bc8404/" target="_blank">隐私协议</a></td>
</tr>
<tr>
<td>推啊 </td>
<td> engine.tuifish.com </td>
<td>基础广告 </td>
<td style="font-size:12px">设备品牌、型号、操作系统版本、OAID、分辨率、IMEI、android ID、SIM 卡 IMSI 信息、应用名称、应用包名、应用版本号、网络信息、应用安装列表、位置信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td style="font-size:12px">识别广告、活动作弊行为;改善 SDK 崩溃率、推送个性化广告;广告投放。 </td>
<td><a href= "https://yun.tuia.cn/tuia/sdk/agreement/index.html" target="_blank">推啊隐私协议</a></td>
</tr>
<tr>
<td>快手 </td>
<td>com.kwad.sdk </td>
<td>增强广告 </td>
<td>基础信息:设备品牌、设备型号、软件系统版本、存储信息、运营商信息、设备时区、设备语言、网络信息等基础信息</br>
设备标识:IMEIs、MEID、OAID、AndroidID、IMSIs、ICCID</br>
位置信息:IP地址、MAC地址、GPS位置信息、基站信息、WIFI信息</br>
应用信息:应用安装列表</br>
其他信息:传感器信息、sim卡激活信息</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.INTERNET <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.VIBRATE
</td>
<td>广告投放、广告归因、反作弊、安全 </td>
<td><a href="https://www.kuaishou.com/about/policy" target="_blank">快手内容联盟隐私协议</a>和<a href="https://u.kuaishou.com/home/detail/1220" target="_blank">SDK使用规范</a></td>
</tr>
<tr>
<td>快手内容联盟 </td>
<td>com.kwad.sdk </td>
<td>增强广告 </td>
<td>基础信息:设备品牌、设备型号、软件系统版本、存储信息、运营商信息、设备时区、设备语言、网络信息等基础信息</br>
设备标识:IMEIs、MEID、OAID、AndroidID、IMSIs、ICCID</br>
位置信息:IP地址、MAC地址、GPS位置信息、基站信息、WIFI信息</br>
应用信息:应用安装列表</br>
其他信息:传感器信息、sim卡激活信息 </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.INTERNET <br>
android.permission.READ_PHONE_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.VIBRATE <br>
android.permission.SET_WALLPAPER<br>
android.permission.READ_EXTERNAL_STORAGE <br>
android.permission.WRITE_EXTERNAL_STORAGE <br>
android.permission.ACCESS_COARSE_LOCATION <br>
android.permission.BLUETOOTH
</td>
<td>广告投放、广告归因、反作弊、安全 </td>
<td><a href="https://www.kuaishou.com/about/policy" target="_blank">快手内容联盟隐私协议</a>和<a href="https://u.kuaishou.com/home/detail/1220" target="_blank">SDK使用规范</a></td>
</tr>
<tr>
<td>优量汇 </td>
<td>com.qq.e </td>
<td>增强广告 </td>
<td>基站、附近的WIFI、连接的WIFI、位置信息、设备制造商、设备型号、操作系统版本、屏幕分辨率、屏幕方向、屏幕DPI、IP地址、加速度传感器、磁场传感器、OAID、IMEI/MEID(Device ID)、Android_ID、包名、版本号、进程名称、运行状态、可疑行为、应用安装信息 </td>
<td style="font-size:12px">
android.permission.INTERNET <br>
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.CHANGE_NETWORK_STATE<br>
android.permission.QUERY_ALL_PACKAGES <br>
android.permission.REORDER_TASKS<br>
android.permission.VIBRATE <br>
android.permission.ACCESS_COARSE_LOCATION
</td>
<td style="font-size:12px">广告投放与监测归因、广告主统计投放结果、减少App崩溃、确保服务器正常运行、提升可扩展性和性能</td>
<td><a href="https://e.qq.com/dev/help_detail.html?cid=2005&pid=5983" target="_blank">优量汇隐私协议</a></td>
</tr>
<tr>
<td>穿山甲 </td>
<td>com.bytedance.sdk.openadsdk</td>
<td>增强广告 </td>
<td>设备品牌、型号、软件系统版本、屏幕密度、屏幕分辨率、设备语言、设备时区、sim卡信息(mcc&mnc)、CPU信息、可用存储空间大小、MAC地址、设备标识符(如IMEI、IMSI、ICCID、GAID(仅GMS服务)、MEID、硬件序列号build_serial、AndroidID、OAID、运营商信息、Wi-Fi状态、网络信号强度、IP地址、应用包名、运行中的进程信息、版本号、应用前后台状态、软件列表信息、线性加速度传感器、磁场传感器、旋转矢量传感器、精确位置信息、粗略位置信息(WiFi列表、WLAN接入点(如SSID,BSSID)、基站) </td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.WRITE_EXTERNAL_STORAGE
</td>
<td>广告投放合作、广告归因、反作弊 </td>
<td><a href="https://www.pangle.cn/privacy/partner" target="_blank">穿山甲隐私协议</a></td>
</tr>
<tr>
<td>Sigmob </td>
<td>com.sigmob.windad </td>
<td>增强广告 </td>
<td>设备信息:设备品牌、型号、操作系统版本、OAID、分辨率等基础设备信息
应用信息:应用名称、应用包名、应用版本号等
其他:运营商信息、时区</td>
<td style="font-size:12px">
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.INTERNET <br>
android.permission.ACCESS_WIFI_STATE <br>
android.permission.CHANGE_WIFI_STATE <br>
android.permission.READ_PHONE_STATE <br>
android.permission.REQUEST_INSTALL_PACKAGES <br>
android.permission.QUERY_ALL_PACKAGES
</td>
<td>广告投放、广告主归因、反作弊 </td>
<td><a href="https://doc.sigmob.com/Sigmob%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E5%90%88%E8%A7%84%E6%9D%A1%E6%AC%BE/%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96/">Sigmob隐私协议</a></td>
</tr>
<tr>
<td>百度百青藤</td>
<td>com.baidu.mobads.proxy </td>
<td>增强广告 </td>
<td>设备信息:设备品牌、型号、软件系统版本、分辨率、网络信号强度、传感器信息,磁盘总空间、系统总内存空间、手机重启信息、手机系统更新时间等基础信息、OAID、AndroidID、屏幕宽高,屏幕像素密度,系统版本号,设备厂商,设备型号,手机运营商,手机网络状态,设备剩余存储空间,手机重启时间和更新时间
开发者应用信息:应用包名、应用前后台状态
设备信息:IMEI、IMSI、MEID
位置信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE<br>
android.permission.ACCESS_COARSE_LOCATION<br>
android.permissio.WRITE_EXTERNAL_STORAGE<br>
</td>
<td>为最终用户提供安全保障、改善我们的产品和服务,开展内部审计、数据分析和研究 </td>
<td><a href="https://union.baidu.com/bqt/#/legal/policies">百度百青藤隐私协议</a></td>
</tr>

<tr>
<td>HUAWEI Ads</td>
<td>com.huawei.hms.ads.lite</td>
<td>增强广告 </td>
<td>设备信息、网络信息、位置信息、应用信息、应用使用信息、上下文信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
</td>
<td>单次请求的广告定向投放、程序化广告投放、广告监测归因与反作弊。</td>
<td><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/whale-hong-kinetic-energy-sdk-privacy-statement-0000001658283582">HUAWEI Ads 隐私声明</a><br><br>和<br><br><a href="https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/whale-hong-kinetic-sdk-compliance-user-guide-0000001658442922">HUAWEI Ads SDK隐私安全说明</a></td>
</tr>

<tr>
<td>章鱼广告</td>
<td>com.octopus.ad</td>
<td>增强广告 </td>
<td>设备品牌、设备型号、设备时区、设备语言、系统版本、开发者应用名、应用版本号、应用包名、网络类型、UserAgent信息、网络状态、崩溃信息、性能数据、屏幕高宽、屏幕方向、屏幕DPI信息、系统更新时间、开机时间、磁盘空间、物理内存、设备ID(OAID、GAID)、IMEI 用户授权才收集、USB调试模式、cpu、运行状态、运营商、传感器信息、掠过手势内容</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
</td>
<td>基于用户设备信息调整广告投放、统计分析、反作弊、实现广告正常显示与交互功能,通过崩溃信息,以此来优化代码缺陷,最大程度减少App崩溃。通过收集SDK运行过程中性能数据,以优化SDK的性能。统计广告数据,以用于广告主统计投放结果。</td>
<td><a href="https://doc.adintl.cn/#/zh-cn/guide/UsePrivacy">章鱼广告SDK隐私政策</a></td>
</tr>

<tr>
<td>倍孜广告</td>
<td>com.beizi.ad</td>
<td>增强广告 </td>
<td>设备品牌、设备型号、设备时区、设备语言、系统版本、网络类型、UserAgent信息、屏幕高宽、屏幕方向、屏幕DPI信息、系统更新时间、开机时间、磁盘空间、物理内存、运营商、sim卡状态、传感器信息、掠过手势内容、cpu、设备ID(国内用户OAID、海外用户GAID)、开发者应用名、应用版本号、应用包名、运行状态、使用数据、诊断数据</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.READ_EXTERNAL_STORAGE<br>
</td>
<td>广告投放策略、统计分析服务、反作弊分析、广告正常显示与交互功能的实现、广告归因、最大程度减少App崩溃、确保服务器正常运行、提升可扩展性和性能</td>
<td><a href="https://sdkdoc.beizi.biz/#/zh-cn/guide/UsePrivacy">BeiZi SDK隐私保护声明</a></td>
</tr>

<tr>
<td>泛连</td>
<td>com.fl.saas.s2s</td>
<td>增强广告 </td>
<td>设备品牌、型号、软件系统版本、屏幕密度、屏幕分辨率、设备语言、设备时区、IMEI、IMSI、ICCID、GAID、MEID、IDFA、IDFV、AndroidID、OAID、手机系统重启时间、设备的MAC地址、User Agent、IP地址、运营商信息、Wi-Fi状态、网络信号强度、应用版本、应用包名、应用名称、应用前后台状态、应用列表信息、加速度传感器、陀螺仪传感器、广告的展示、点击及转化等交互数据、系统崩溃数据、性能数据</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.VIBRATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.READ_PHONE_STATE<br/>
</td>
<td>广告投放及广告监测归因、反作弊、摇一摇广告投放、广告投放统计分析、提升SDK的稳定性,减少APP的崩溃</td>
<td><a href="https://www.adfunlink.com/doc/privacy.html">Funlink隐私保护声明</a></td>
</tr>

<tr>
<td>聚力阅盟</td>
<td>com.dcloudym</td>
<td>增强广告 </td>
<td>设备型号、操作系统版本、唯一设备标识符、设备环境等软硬件特征信息;GPS位置以及WLAN接入点、蓝牙和基站等传感器信息</td>
<td style="font-size:12px">
android.permission.INTERNET<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.VIBRATE<br>
android.permission.REQUEST_INSTALL_PACKAGES<br>
android.permission.READ_PHONE_STATE<br/>
android.permission.WRITE_EXTERNAL_STORAGE<br/>
android.permission.ACCESS_COARSE_LOCATION<br/>
android.permission.ACCESS_FINE_LOCATION<br/>
</td>
<td>广告投放及广告监测归因、反作弊、摇一摇广告投放</td>
<td><a href="https://idbj.juliyuemeng.com/privacy">聚力阅盟隐私保护声明</a></td>
</tr>
</table>

腾讯x5内核

<a id="e885bee8aeafx5e58685e6a0b8"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:15%">使用目的</th>
<th style="width:30%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>腾讯浏览服务SDK</td>
<td>com.tencent.tbs、com.tencent.smtt</td>
<td>x5内核渲染webview(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.ACCESS_NETWORK_STATE<br>
android.permission.ACCESS_WIFI_STATE<br>
android.permission.READ_PHONE_STATE
</td>
<td>存储的个人文件、读取手机状态和身份、网络信息</td>
<td><a href="https://x5.tencent.com/docs/privacy.html" target="_blank">https://x5.tencent.com/docs/privacy.html</a></td>
</tr>
</table>

Contacts

<a id="Contacts"/>

管理系统通讯录,用于可对系统通讯录进行增、删、改、查等操作。通过plus.contacts获取系统通讯录管理对象。

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Contacts</td>
<td>io.dcloud.feature.contacts</td>
<td>管理系统通讯录,用于可对系统通讯录进行增、删、改、查等操作(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.GET_ACCOUNTS<br>
android.permission.WRITE_CONTACTS<br>
android.permission.READ_CONTACTS
</td>
<td>获取联系人信息</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

Messaging

<a id="Messaging"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Messaging</td>
<td>io.dcloud.feature.messagings</td>
<td>管理设备通讯功能,可用于短信、彩信、邮件发送等(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.RECEIVE_SMS<br>
android.permission.SEND_SMS<br>
android.permission.WRITE_SMS<br>
android.permission.READ_SMS
</td>
<td>读写短信、彩信、邮件</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

Bluetooth(低功耗蓝牙)

<a id="Bluetooth"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>Bluetooth</td>
<td>io.dcloud.feature.bluetooth</td>
<td>访问蓝牙设备,包括搜索、连接。(请根据具体使用目的填写)</td>
<td style="font-size:12px">
android.permission.ACCESS_FINE_LOCATION<br>
android.permission.ACCESS_COARSE_LOCATION<br>
android.permission.BLUETOOTH<br>
android.permission.BLUETOOTH_ADMIN<br><br>
以下两种权限在targetSdkVersion31及以上才需要!<br>
android.permission.BLUETOOTH_SCAN<br>
android.permission.BLUETOOTH_CONNECT
</td>
<td>访问蓝牙设备、位置信息。</td>
<td style="font-size:12px">(宿主根据APP自身逻辑 自行填写相关隐私政策信息)</td>
</tr>
</table>

FacialRecognitionVerify(实人认证)

<a id="FacialRecognitionVerify"/>

<table style="word-break:break-all">
<tr>
<th style="width:10%">SDK名称</th>
<th style="width:10%">包名信息</th>
<th style="width:25%">使用目的</th>
<th style="width:20%">使用的权限</th>
<th style="width:20%">涉及个人信息</th>
<th style="width:10%">隐私权政策链接</th>
</tr>
<tr>
<td>实人认证</td>
<td>com.dtf.face.verify</td>
<td>实人认证服务搭载真人检测和人脸比对等生物识别技术,配合权威数据源验证,可快速校验自然人的真实身份。</td>
<td style="font-size:12px">
android.permission.READ_PHONE_STATE<br>
android.permission.INTERNET<br>
android.permission.WRITE_EXTERNAL_STORAGE<br>
android.permission.CAMERA<br>
</td>
<td>设备信息、最终用户上传的语音、图片信息、终端权限信息、日志信息</td>
<td style="font-size:12px"><a href="https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202107281509_18386.html" target="_blank">https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202107281509_18386.html</a></td>
</tr>
</table>

如果您的应用使用了依赖三方SDK的模块也需要将其合规条款添加到《隐私政策》中

uni原生插件

如果应用使用了uni原生插件,需要注意一下几点:

  • 使用插件时请查看插件详情页面中的 隐私、权限声明 。(插件使用什么sdk?获取了什么用户信息?都应由插件作者提供并填写在 隐私、权限声明中)
  • 将插件中用到的三方SDK信息添加到用户隐私协议中。例如集成了百度定位。就需要在隐私协议中说明集成了百度定位SDK。获取了xxx用户信息!用于xxx.
  • 如果发现插件有获取用户信息而插件详情页并没有提供隐私、权限声明,请与插件开发者或与我们反馈共同督促进行补充。

其它

《隐私政策》必须非常清楚、全面地说明(不要用可能收集、了解用户信息这种模糊不清晰的词语)收集用户个人信息的目的、方式和范围。
如果应用使用“通讯录”、“短信”等相关功能,请根据应用业务场景进行描述。

收起阅读 »

小程序封装组件,数据更新页面不更新

微信小程序

数据通过props传递的,对数据操作后页面不更新,建议使用一个新变量保存数据,不要操作传入的数据,比如通过计算属性,监听,或者直接在data赋值

数据通过props传递的,对数据操作后页面不更新,建议使用一个新变量保存数据,不要操作传入的数据,比如通过计算属性,监听,或者直接在data赋值

Uni-App 推流组件在线测试地址

LivePusher直播推流插件配置 直播

Uni-App 推流组件在线测试地址:

RTMP协议地址: rtmp://81.70.104.12:18881/live/livestream
支持推流,拉流。

HLS协议: http://81.70.104.12:8080/live/livestream.m3u8
支持拉流

继续阅读 »

Uni-App 推流组件在线测试地址:

RTMP协议地址: rtmp://81.70.104.12:18881/live/livestream
支持推流,拉流。

HLS协议: http://81.70.104.12:8080/live/livestream.m3u8
支持拉流

收起阅读 »

使用ShopXO开源商城uniapp主题版打包教程

小程序 打包

源代码地址
uniapp插件:https://ext.dcloud.net.cn/plugin?id=6380

1. 下载 HBuilderX 工具
> HBuilderX支持插件拓展功能。App开发版已集成相关插件、开箱即用
根据自身电脑系统选择对应软件下载,建议选择APP开发版
下载地址:https://www.dcloud.io/hbuilderx.html

2. 下载好软件安装后打开

> 建议直接在uniapp插件页面一键导入,正常情况下uniapp插件都是最新的,大家可以看git平台正式版本提交的记录日期在uniapp插件页面更新日期之前、就表示uniapp插件也是最新版本。如果不是最新的可自行到以上git地址平台下载包,解压后直接将源码目录拖入 HBuilderX 工具即可

一键导入方式、uniapp插件地址:https://ext.dcloud.net.cn/plugin?id=6380

3. 左侧选中 App.vue 文件
> 将该源码导入HBuilderX开发工具、顶部工具栏 运行->运行到小程序模拟器->(根据支持平台自行选择、如 微信开发者工具)
App.vue中修改 request_url 和 static_url 地址为自己的商城地址即可使用
主题默认为黄色(yellow),如更改主题 App.vue文件中 default_theme + 底部css引入,pages.json文件中 tabBar选中图标+selectedColor选中颜色
manifest.json 文件中修改对应终端配置,比如小程序appid(微信小程序直播、好物推荐配置都在这里面自行去掉注释、一定要先申请权限、不然小程序空白)
发布、HBuilderX开发工具、顶部工具栏 发行->(根据支持平台自行选择、如 微信开发者工具)

微信小程序:需要再下载微信小程序开发者工具,打开,在顶部设置-安全设置(打开安全)

继续阅读 »

源代码地址
uniapp插件:https://ext.dcloud.net.cn/plugin?id=6380

1. 下载 HBuilderX 工具
> HBuilderX支持插件拓展功能。App开发版已集成相关插件、开箱即用
根据自身电脑系统选择对应软件下载,建议选择APP开发版
下载地址:https://www.dcloud.io/hbuilderx.html

2. 下载好软件安装后打开

> 建议直接在uniapp插件页面一键导入,正常情况下uniapp插件都是最新的,大家可以看git平台正式版本提交的记录日期在uniapp插件页面更新日期之前、就表示uniapp插件也是最新版本。如果不是最新的可自行到以上git地址平台下载包,解压后直接将源码目录拖入 HBuilderX 工具即可

一键导入方式、uniapp插件地址:https://ext.dcloud.net.cn/plugin?id=6380

3. 左侧选中 App.vue 文件
> 将该源码导入HBuilderX开发工具、顶部工具栏 运行->运行到小程序模拟器->(根据支持平台自行选择、如 微信开发者工具)
App.vue中修改 request_url 和 static_url 地址为自己的商城地址即可使用
主题默认为黄色(yellow),如更改主题 App.vue文件中 default_theme + 底部css引入,pages.json文件中 tabBar选中图标+selectedColor选中颜色
manifest.json 文件中修改对应终端配置,比如小程序appid(微信小程序直播、好物推荐配置都在这里面自行去掉注释、一定要先申请权限、不然小程序空白)
发布、HBuilderX开发工具、顶部工具栏 发行->(根据支持平台自行选择、如 微信开发者工具)

微信小程序:需要再下载微信小程序开发者工具,打开,在顶部设置-安全设置(打开安全)

收起阅读 »

修改任何东西都会弹出控制台

控制台 HBuilderX

现在是修改任何东西都会主动弹出控制台,能不能修改东西之后,只要用户不主动打开,就不要弹出控制台,或者有报错再主动弹出来

现在是修改任何东西都会主动弹出控制台,能不能修改东西之后,只要用户不主动打开,就不要弹出控制台,或者有报错再主动弹出来

纯nvue开发安卓端APP演示项目

uniCloud uniapp nvue

nvue开发APP具有性能好的优势,空闲之余,遂采用nvue开发前端,uniCloud开发后端的方式,开发了一款功能较为简单的社交类安卓端APP演示应用,功能较为简单,但开发过程中涉及到的技术点较为全面,相信大部分开发同行都会遇到,开发过程中也踩过不少坑,在此发帖,以期和有兴趣的朋友交流学习,也可以代为开发APP项目。尽管这是非商业项目,目的用于交流学习,该演示项目也已取得软件著作权证书,还希望各位朋友尊重劳动成果,不要反编译和破解,有想技术和知识交流的尽管提问,一定知无不言。

前端部分:
页面全部是采用nvue,布局推荐使用flex布局,css写法较为受限,但uniapp对nvue样式的支持是绝对能满足开发所需的,要比weex的支持更加友好。组件推荐使用uni-ui,实在没有合适的自己也可以写组件

后端部分:
采用的是uniCloud,主要是对数据的增删改查,事务的运用,用户的注册登陆和token的维护等等。存储使用云存储即可。

涉及到的知识点如下:
1、flex布局,自定义顶部导航,nvue简单过渡动画、swiper加list、cell、refresh等组件的配合使用;长列表数据推荐使用list组件,实机体验起来还是不错的;
2、返回顶部操作,nvue返回页面顶部需要用到uni.requireNativePlugin(),且在list组件内第一个子组件要设置ref,类似于锚点的位置;
3、层级的实现,nvue的层级不是靠z-index来实现的,是写在容器越里面,则显示在最上面来实现的;
4、背景图的实现;
5、app启动隐私政策和用户协议的配置;
6、第三方登陆的配置,此演示项目使用了QQ登陆;
7、分享功能的实现,自己有注册第三方分享的话用自定义分享,若没有,可以使用系统级分享;
8、开屏广告的配置和内容联盟的配置;
9、实现随机获取不重复的后端数据;
10、事务在uniCloud中的运用,例如点赞操作,必须是点赞成功、点赞量加1、给对应用户发送消息等等一些列操作全部成功,方能提交对数据库数据的更改,否则事务需要回滚,保证操作的合理。在电商项目里经常会用到事务;
11、邮件的发送;
12、用户信息的维护使用uni-id即可,注册、登陆、token的维护官方都已经封装好了;
13、版本更新的实现;
14、项目配置文件的管理;
15、云函数中开发过程中错误信息的调试;
16、数据库的建表、增删改查的实现、联表查询等;
.............................................................................
细节上的知识点待后面陆续更新

效果图如下:

继续阅读 »

nvue开发APP具有性能好的优势,空闲之余,遂采用nvue开发前端,uniCloud开发后端的方式,开发了一款功能较为简单的社交类安卓端APP演示应用,功能较为简单,但开发过程中涉及到的技术点较为全面,相信大部分开发同行都会遇到,开发过程中也踩过不少坑,在此发帖,以期和有兴趣的朋友交流学习,也可以代为开发APP项目。尽管这是非商业项目,目的用于交流学习,该演示项目也已取得软件著作权证书,还希望各位朋友尊重劳动成果,不要反编译和破解,有想技术和知识交流的尽管提问,一定知无不言。

前端部分:
页面全部是采用nvue,布局推荐使用flex布局,css写法较为受限,但uniapp对nvue样式的支持是绝对能满足开发所需的,要比weex的支持更加友好。组件推荐使用uni-ui,实在没有合适的自己也可以写组件

后端部分:
采用的是uniCloud,主要是对数据的增删改查,事务的运用,用户的注册登陆和token的维护等等。存储使用云存储即可。

涉及到的知识点如下:
1、flex布局,自定义顶部导航,nvue简单过渡动画、swiper加list、cell、refresh等组件的配合使用;长列表数据推荐使用list组件,实机体验起来还是不错的;
2、返回顶部操作,nvue返回页面顶部需要用到uni.requireNativePlugin(),且在list组件内第一个子组件要设置ref,类似于锚点的位置;
3、层级的实现,nvue的层级不是靠z-index来实现的,是写在容器越里面,则显示在最上面来实现的;
4、背景图的实现;
5、app启动隐私政策和用户协议的配置;
6、第三方登陆的配置,此演示项目使用了QQ登陆;
7、分享功能的实现,自己有注册第三方分享的话用自定义分享,若没有,可以使用系统级分享;
8、开屏广告的配置和内容联盟的配置;
9、实现随机获取不重复的后端数据;
10、事务在uniCloud中的运用,例如点赞操作,必须是点赞成功、点赞量加1、给对应用户发送消息等等一些列操作全部成功,方能提交对数据库数据的更改,否则事务需要回滚,保证操作的合理。在电商项目里经常会用到事务;
11、邮件的发送;
12、用户信息的维护使用uni-id即可,注册、登陆、token的维护官方都已经封装好了;
13、版本更新的实现;
14、项目配置文件的管理;
15、云函数中开发过程中错误信息的调试;
16、数据库的建表、增删改查的实现、联表查询等;
.............................................................................
细节上的知识点待后面陆续更新

效果图如下:

收起阅读 »

济南专业竞拍商城APP小程序定制开发公司

济南专业竞拍商城APP小程序定制开发公司,咨询(张13O微66O电29294)

  一、竞拍商城逻辑:

  城市,只需开通了拍卖的城市,订单才有可能转变成拍卖订单;

  用户在请求借款时的请求金额,必须要大于必定的金额;

  订单评分,这是咱们自己的评分体系,也是要求某个订单大于某个评分,才干转变成拍卖订单。

  二、操控拍卖订单的参数

  拍卖体系开发,开发拍卖体系,广州拍卖体系开发,专ye拍卖体系开发

  生成了拍卖订单,还得对拍卖订单进行有用的操控,因而需要对以下参数进行操控:

  拍卖时长,这是一个具有争议的参数,有人觉得15分钟都太长,有人觉得30分钟都不算短,并且其时没有数据表明到底多长时间比较合适,由于也得做成操控项;

  拍卖延倒ji时,即在延倒ji时内假如还有人出价,拍卖主动延,延伸=延周期+拍卖剩下时长;

  拍卖延周期,即假如在延倒ji时内有人出价,应该再添加的拍卖时长;

  拍卖一口价系数,这个系数决定了拍卖的高价,对,你没有看错,咱们为了避免某些订单价格被拉得太高,对高价也进行了必定程度的操控;

  加价起伏,即每一次点击可以在当前价格的基础上的加价金额;

  体系定价(+起拍加价),即咱们对订单有个体系定价,次出价不是体系定价,而是体系定价+起拍加价,即起拍价=体系定价+起拍加价。

继续阅读 »

济南专业竞拍商城APP小程序定制开发公司,咨询(张13O微66O电29294)

  一、竞拍商城逻辑:

  城市,只需开通了拍卖的城市,订单才有可能转变成拍卖订单;

  用户在请求借款时的请求金额,必须要大于必定的金额;

  订单评分,这是咱们自己的评分体系,也是要求某个订单大于某个评分,才干转变成拍卖订单。

  二、操控拍卖订单的参数

  拍卖体系开发,开发拍卖体系,广州拍卖体系开发,专ye拍卖体系开发

  生成了拍卖订单,还得对拍卖订单进行有用的操控,因而需要对以下参数进行操控:

  拍卖时长,这是一个具有争议的参数,有人觉得15分钟都太长,有人觉得30分钟都不算短,并且其时没有数据表明到底多长时间比较合适,由于也得做成操控项;

  拍卖延倒ji时,即在延倒ji时内假如还有人出价,拍卖主动延,延伸=延周期+拍卖剩下时长;

  拍卖延周期,即假如在延倒ji时内有人出价,应该再添加的拍卖时长;

  拍卖一口价系数,这个系数决定了拍卖的高价,对,你没有看错,咱们为了避免某些订单价格被拉得太高,对高价也进行了必定程度的操控;

  加价起伏,即每一次点击可以在当前价格的基础上的加价金额;

  体系定价(+起拍加价),即咱们对订单有个体系定价,次出价不是体系定价,而是体系定价+起拍加价,即起拍价=体系定价+起拍加价。

收起阅读 »