Search code examples
javascriptcordovatypescriptcordova-plugins

Uncaught TypeError: Cannot read property 'getSMS' of null


Below code is a cordova android sms acess permission plugin code. and it is working fine.

inside that i am trying to call my this.getSMS() function it is throughing error

setTimeout(() => {
      this.holders.dissmissLoadingCustom();
      platform.ready().then(() => { 

      var permissions = cordova.plugins.permissions;

        permissions.hasPermission(permissions.READ_SMS, checkPermissionCallback, null);

        function checkPermissionCallback(status) {
          if(!status.hasPermission) {
            var errorCallback = () => {
              console.log("invoking the errorCallback");
              alert('READ_SMS permission is not turned on');
            }

            permissions.requestPermission(
              permissions.READ_SMS,
              (status) => {
                console.log("invoking status");

              if(!status.hasPermission) {
                console.log("invoke !status.hasPermission");
                errorCallback();
              }
              else{
                console.log("invoking else part !status.hasPermission");
                this.getSMS();//this line through error
              }
            },
            errorCallback);
          }
        }

      });

    }, 10000);

if the user tap allow then i am trying to call my this.getSMS() as you can see in the above code. if user deny then i am just getting error callback.

i dont know what i am doing wrong.


Solution

  • You have defined checkPermissionCallback as a regular function. The this keyword points to that function and not the actual class in which it is defined.

    setTimeout(() => {
          this.holders.dissmissLoadingCustom();
          platform.ready().then(() => { 
    
          var permissions = cordova.plugins.permissions;
    
            permissions.hasPermission(permissions.READ_SMS, (status)=>checkPermissionCallback(status), null);//use arrow to call
    
            function checkPermissionCallback(status) {
              if(!status.hasPermission) {
                var errorCallback = () => {
                  console.log("invoking the errorCallback");
                  alert('READ_SMS permission is not turned on');
                }
    
                permissions.requestPermission(
                  permissions.READ_SMS,
                  (status) => {
                    console.log("invoking status");
    
                  if(!status.hasPermission) {
                    console.log("invoke !status.hasPermission");
                    errorCallback();
                  }
                  else{
                    console.log("invoking else part !status.hasPermission");
                    this.getSMS();//this line through error
                  }
                },
                errorCallback);
              }
            }
    
          });
    
        }, 10000);
    

    Or you can save this to another variable before the function definition or use bind.