1. 程式人生 > >微信小程式之 簡單的使用者授權系列操作

微信小程式之 簡單的使用者授權系列操作

一、獲取使用者登入狀態 和 獲取使用者資訊

想獲取使用者資訊,需要點選btn按鈕,給button設定屬性open-type="getUserInfo" 和bindgetuserinfo="MygetUserInfo"

<button open-type="getUserInfo" bindgetuserinfo="MygetUserInfo">獲取使用者資訊</button>

獲取使用者資訊之前先獲取登入狀態wx.login,不過登入了微信的話一般登入狀態都是對的,但也有時限,這個看文件吧。

登陸成功後呼叫wx.getUserInfo會彈出授權框,成功後就會返回一個存著使用者頭像名稱等的資訊,還有個加密資訊,加解密還沒看,看了補充

 MygetUserInfo: function(){
    var _this = this;
    wx.login({
      success: function(res){
        /* 獲取使用者資訊的彈框 */
        wx.getUserInfo({
          /*withCredentials預設值為true,可不填,當設為false時就獲取不到使用者的加密資訊*/
          withCredentials: true,
          success: function(res){
            console.log(res);
            var user = res.userInfo
            _this.setData({
              userInfo: user,
              hasUserInfo: true
            })

          },
          fail:function(res){
            console.log(res)
          }
       })
     }
  })
}

二、開啟授權設定頁面

方式1.wx.openSetting,給按鈕新增一個點選事件,事件中直接呼叫api,但文件中說即將廢棄,改用方法2

wx.openSetting({

   success: res => { console.log(res) }

})

方式2.給button按鈕設定屬性open-type="openSetting" 和 bindopensetting="MyopenSetting",點選按鈕也會彈出授權設定頁面

<button open-type="openSetting" bindopensetting="MyopenSetting">檢視使用者設定介面並修改</button>

MyopenSeting自定義事件裡返回的事件物件res.detail.authSetting儲存著授權狀態,這個事件在設定頁面關閉時觸發

MyopenSetting: function(res){
    console.log(res.detail.authSetting)
},

三、返回授權狀態  wx.getsetting

在上面授權設定頁面關閉時也會返回授權狀態,但還包括其他資訊,要一層一層找,這個wx.getsetting直接返回所有觸發過授權彈窗的所有授權狀態

四、主動調出授權框  wx.authorize()

原話是 “開發者可以使用 wx.authorize 在呼叫需授權 API 之前,提前向用戶發起授權請求。

引數是一個物件,其中scope屬性設定是什麼許可權。scope.record就是錄音授權,其他的看文件吧

wx.authorize({
   scope: 'scope.record',
   success: res=>{
      console.log(res)
   }
})

五、錄音授權 和 錄音使用

這個就是定義了 錄音授權、開始錄音、暫停錄音、繼續錄音、停止錄音四個按鈕,然後繫結bindtap自定義事件

要使用錄音需要先獲取全域性唯一的錄音器。我是在onload中定義了一個const recorderManager = wx.getRecorderManager();然後把它setData到了data裡,後面用錄音器就呼叫this.data.recorderManager。但看網上是存到全域性變數裡,難道變數可以不定義在data中嗎?還是說wxml需要這樣{{}}呼叫的資料才必須放到data中?後面我再查檢視,也希望朋友們誰知道的話說一聲,謝啦!

最後要播放錄音,需要先用wx.createInnerAudioContext獲取全域性唯一的播放器。然後在停止錄音後,將生成的音訊地址,傳到播放器.src中,然後play(),onPlay事件處理播放器播放時的資訊。

這裡的播放器我是定義了一個區域性變數,一開始想和錄音器一樣在onload中定義,然後全域性使用的時候,發現有錯誤。(好吧,剛剛又試了一遍,發現只是在開發工具上報錯,在手機上使不報錯的) 因為我定義播放器後,給出錯加了一個列印,InnerAudioContext.onError( res => {console.log(res)}),然後模擬時報錯資訊是

,但其實不管是全域性還是區域性播放器變數都會抱著個錯,只不過我是改成區域性時才在真機上實驗的,可以用,我就以為區域性才可以,現在我又試了下全域性,手機上也可以,不報這個錯。

// 設定錄音授權的授權框
  MyLYauthorize: function(){
    console.log('錄音授權')
    wx.authorize({
      scope: 'scope.record',
      success: res=>{
        console.log(res)
      }
      
    })
  },
//開始錄音 
  startRecord: function(){
    this.data.recorderManager.start()
    this.data.recorderManager.onStart(() => {
      console.log('recorder start')
    })
  },
//暫停錄音和繼續錄音
  pauseRecord: function (){
    if(this.data.paused){
      this.setData({
        paused : false,
        pauseText: "暫停錄音"
      })
      this.data.recorderManager.resume()
    }else{
      this.setData({
        paused: true,
        pauseText: "繼續錄音"
      })
      this.data.recorderManager.pause()
    }
    this.data.recorderManager.onPause(() => {
      console.log('recorder pause')
    })
  },
//停止錄音,此時會返回一個時間物件,裡面存著音訊的src、時間一類的資訊
  stopRecord: function (){
    this.data.recorderManager.stop()
    this.data.recorderManager.onStop((res) => {
      console.log('recorder stop')
      console.log(res)
      var recordFile = res.tempFilePath;
      this.setData({
        recordFile: recordFile,
      })
    })
  },

//播放錄音,需要先用wx.createInnerAudioContext獲取全域性唯一的播放器。然後在停止錄音後,將生成的音訊地址,傳到播放器.src中,然後play(),onPlay事件處理播放器播放時的資訊
  playRecord: function(){
    var InnerAudioContext = wx.createInnerAudioContext();
    console.log(InnerAudioContext)
    InnerAudioContext.onError( res => {
      console.log(res)
    })
    InnerAudioContext.src = this.data.recordFile
    InnerAudioContext.play();//在安卓手機上可以播放,但暫停不管用
    InnerAudioContext.onPlay(() => {
      console.log("播放");
    })
  },

六、地理位置授權

地理位置授權成功之後,我是又呼叫了開啟地圖檢視位置的api wx.getLocation()。

引數裡的type有兩種:“wga84”  和'gcj02'

使用第一種的話就是用wx.chooseLocation開啟地圖;

使用第二種的話就是用wx.openLocation開啟微信內建地圖。上面那個是什麼地圖我也不清楚,汗。

剛剛在安卓手機上試了下,發現第一種打不開地圖,授權之後沒反應。第二種可以開啟。

MyDLauthorize: function(){
    console.log("地理位置授權")
    wx.authorize({
      scope: 'scope.userLocation',
      success: res => {

       //開啟地圖檢視位置
        wx.getLocation({
          type:"wga84",
          success: function(res){
            // console.log(res)
            wx.chooseLocation({
              success: res => {
                console.log(res)
              }
            })
          }
        })
        

        // 開啟微信內建地圖wx.openLocation
        wx.getLocation({
          type: 'gcj02', //返回可以用於wx.openLocation的經緯度
          success: function (res) {
            var latitude = res.latitude
            var longitude = res.longitude
            wx.openLocation({
              latitude: latitude,
              longitude: longitude,
              scale: 28
            })
          }
        })
      }
    })
  },

七、分享功能的開和關

定義了一個開啟分享功能的btn,一個關閉分享功能的btn,還有一個通過點選按鈕分享頁面的btn(這個按鈕是需要用botton屬性open-type的)

<button bindtap="startShare">允許分享</button>
<button bindtap="stopShare">關閉分享</button>
<!-- button屬性plain="false"會鏤空 -->
<button open-type="share" type="primary" data-id="1">分享</button>

然後定義兩個自定義事件,和一個監聽事件(onShareAppMessage監聽事件用來監聽分享的操作。分享方式一個是點選右上角的...,另一種就是用button。監聽事件可以判斷是不是通過點選按鈕分享的,見程式碼)

  // 開啟分享
  startShare: function(){
    wx.showShareMenu({ 
    })
  },

  // 關閉分享
  stopShare: function(){
    wx.hideShareMenu({ 
    })
  },

  // 分享設定
  onShareAppMessage: function(res){
    if (res.from === 'button') {
      // 來自頁面內轉發按鈕
      console.log(res.target)
    }
    return {
      title: '測試分享標題',
      path: '/pages/home',//換成別的地址也不生效,還是當前地址
      imageUrl: '/images/logo_dog3.jpg'
    }
 }

終於把今天下午的這些東西整理完了。。。洗澡去~