javascript - Ionic/Angular Diagnostic.requestRuntimePermission 如何? (文档不完整)

标签 javascript android angularjs cordova ionic-framework

在我的应用程序中,我需要请求相机、音频输入(微型)和存储的权限。 我猜想从 Android 6 开始,您必须在运行时请求这些权限才能获得访问权限。到目前为止,一切都很好。 为此,您需要 Ionic 2 Cordova 插件“诊断”,可以在 here 找到该插件。 .

如您所见,此文档非常不完整。它仅显示如何获取蓝牙的当前状态。 好吧,但是你实际上如何调用许可呢?您要返回什么状态才能使用开关/外壳。所有这些信息都是需要的,但这里不需要。

据我尝试,我发现存在某种diagnostic.requestRuntimePermission 函数。使用此功能,您可以执行以下操作:

           that.diagnostic.requestRuntimePermission('CAMERA')
             .then((status) =>{
                  switch(status){
                      case "GRANTED":
                          console.log("Permission granted to use the camera");
                          break;
                      case "DENIED":
                          console.log("Permission denied to use the camera - ask again?");
                          break;
                      case "DENIED_ALWAYS":
                          console.log("Permission permanently denied to use the camera - guess we won't be using it then!");
                          break;
                  }
              }).catch(e => console.error(e));

注意:这只是一个我认为可能看起来像的代码,但我不知道它是否有效。 那么我们以相机权限为例来解决这个问题: 要检查相机是否可用,我这样做:

let successCallback = (isAvailable) => { console.log('Is available? ' + isAvailable); };
let errorCallback = (e) => console.error(e);
that.diagnostic.isCameraAvailable().then(successCallback).catch(errorCallback);

之后,我必须获取相机的 AuthorizationSttus,以了解是否授予、拒绝甚至尚未请求权限。其工作原理如下:

 that.diagnostic.getCameraAuthorizationStatus()
 .then((state) => {
   switch(state){
       /*HERE should I work with the State in order to request permission or not*/
   }
}).catch(e => console.error(e));

在这一步我不知道该做什么了,因为我不知道我会在这里返回哪些状态。 我认为是这样的:

 switch(status){
     case "GRANTED":
        console.log("Permission granted to use the camera");
        break;
     case "DENIED":
        //Here should I now call the PermissionRequest function
        console.log("Permission denied to use the camera - ask again?");
        break;
     case "DENIED_ALWAYS":
        console.log("Permission permanently denied to use the camera - guess we won't be using it then!");
        break;
   }

这不起作用,但我认为一定是这样的。 所以请帮助我并告诉我:

  • 此处返回哪些状态以及如何访问它

  • 如何正确使用diagnostics.requestRuntimePermission?

Here是具有相同问题的原始 Ionic2 论坛的链接。

最佳答案

我认为您使用了错误的cordova插件来请求运行时权限。 diganostics 插件旨在告诉您某些设备功能(例如相机)是否可用。我推荐Android Permissions plugin用于在运行时请求权限。请注意,还有一个 Ionic Native wrapper可用于插件。

编辑: 要回答您的确切问题:根据Ionic Native wrapper class对于此插件,权限状态请求的响应将是以下对象属性之一:

permissionStatus: {
  GRANTED: string;
  DENIED: string;
  NOT_REQUESTED: string;
  DENIED_ALWAYS: string;
  RESTRICTED: string;
  GRANTED_WHEN_IN_USE: string;
};

在您的 Ionic 类中,您可以通过以下方式访问它,假设您通过以下方式在构造函数中注入(inject)了 ionic-native 类:

constructor(private diagnostic: Diagnostic){}

您可以像这样访问permissionStatus对象:

this.diagnostic.permissionStatus

随后您可以重写 switch-case 语句:

let permissionStatus = this.diagnostic.permissionStatus;
that.diagnostic.getCameraAuthorizationStatus()
  .then((state) => {
    switch(state){
      case permissionStatus.GRANTED:
        console.log("Permission granted to use the camera");
        break;
      case permissionStatus.DENIED:
        //Here should I now call the PermissionRequest function
        console.log("Permission denied to use the camera - ask again?");
        break;
      case permissionStatus.DENIED_ALWAYS:
        console.log("Permission permanently denied to use the camera - guess 
        we won't be using it then!");
        break;
    }
}).catch(e => console.error(e));

对于请求,例如运行时的相机权限:

let permission = this.diagnostic.permission;
this.diagnostic.requestRuntimePermission(permission.CAMERA).then(
  success => {
    console.log('reuqestCameraAuthroization, success', success);
  },
  error => {
    console.log('reuqestCameraAuthroization, error', error);
  },
);

但我认为您不需要在permissionStatus.DENIED或permissionStatus.NOT_REQUESTED的情况下手动请求运行时权限,因为Ionic docs值得一提的是,如果您不使用“false”参数调用 getCameraAuthorizationStatus,则默认情况下它将请求运行时权限。

如果您不确定 Promise 的结果如何,您可以随时将其记录到控制台(例如 console.log(success))。并且您始终可以记录可注入(inject)的内容(在您的情况下为 this.diagnostic)以查看哪些公共(public)方法和对象可用。

关于javascript - Ionic/Angular Diagnostic.requestRuntimePermission 如何? (文档不完整),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45544642/

相关文章:

javascript - 访问 Angular 5 组件中的 javascript 变量

android - 选择器 react 缓慢 - 有时在开始下一个 Activity 之前根本不触发

javascript - 在 AngularJS 中检测和验证客户端日期更改

javascript - pouchdb 已停止同步且没有错误

javascript - 检查点击事件是否由 tr 中的按钮发起

javascript - 如何在其类上使用 jQuery 获取选择的所有选项,而不是 ID?

javascript - axios.delete 正在从 firebase 数据库中删除所有节点

android - 如何使用新的 Android 数据绑定(bind)库来填充基于集合的 LinearLayout 的子项?

android - Glide 将两个图片 url 叠加到同一个 imageView 中

javascript - 在 AngularJS 之后加载 jQuery