简体   繁体   中英

Ionic permissions won't change (android)

First time asking a question here, so sorry if I miss anything.

I'm trying to develop a cross-platform application and am currently testing on android, however, I'm unable to get any permissions excluding the default "full network access" permission. I'm trying specifically to get the CALL_PHONE permission, but have been trying to test others as well.

I've tried to use both the Cordova-plugins-android-permissions and the Cordova-plugins-diagnostic however, it seems that they are failing to call the example functions on their pages (also alert(cordova.plugins.permissions) returns undefined).

I've tried the application in both SDK version 22 and 24 to see if I can get the permissions working pre-marshmallow but to no effect (this includes the vibrate permission which apparently shouldn't need it's own request).

I'm enclosing my index.html(my primary page), config.xml and androidmanifest.xml below.

Thanks in advance.

Index.html:

<!DOCTYPE html>
<html>
  <head>
  <script src="../jquery-3.1.1.min.js"></script>
<link rel="stylesheet" href="../jquery-ui.css">
<script src="jquery-3.1.1.min.js"></script>
<link rel="stylesheet" href="jquery-ui.css">
<link rel="stylesheet" href="lone.css">
 <script src="js/MainCtrl.js"></script>
  <script>
  $ionicPlatform.ready(function() {
        window.plugin.notification.local.promptForPermission();
});
  window.onload = function(){
  window.PhoneCaller.call("//Editing for privacy", onSuccess, onError);
  var permissions = cordova.plugins.permissions;
permissions.hasPermission(permissions.CAMERA, checkPermissionCallback, null);

function checkPermissionCallback(status) {
  if(!status.hasPermission) {
    var errorCallback = function() {
      alert('Camera permission is not turned on');
    }

    permissions.requestPermission(
      permissions.CAMERA,
      function(status) {
        if(!status.hasPermission) errorCallback();
      },
      errorCallback);
  }
}
  //window.location.href ="test.java";
  var check = 1;
    var url=window.location.href
    url = url.substring(url.indexOf(".html")+5,url.length);
    if(url.length>0){
        try{
            localStorage.removeItem("name");
            localStorage.removeItem("no");
            localStorage.removeItem("email");
            localStorage.removeItem("timer");
        }
        catch(err){

        }
        var bigname = url.substring(url.indexOf("name=")+5,url.indexOf("&"));
        localStorage.setItem("name",bigname);
        url=url.substring(url.indexOf(bigname)+bigname.length+1,url.length);
        var bigno = url.substring(url.indexOf("noin=")+5,url.indexOf("&"));
        localStorage.setItem("no",bigno);
        url=url.substring(url.indexOf(bigno)+bigno.length+1,url.length);
        var bigemail = url.substring(url.indexOf("email=")+6,url.indexOf("&"));
        localStorage.setItem("email",bigemail);
        url=url.substring(url.indexOf(bigemail)+bigemail.length+1,url.length);
        var bigtimer = url.substring(url.indexOf("timer=")+6,url.indexOf("&"));
        localStorage.setItem("timer",bigtimer);

    }
  }
        function test(){
            if(check == 1){
    document.getElementById("call").click;
        $('#call')[0].click();
            undo();
            }
        }
        function undo(){
            check = 0;
            wait(500);
            check = 1;
        }
        function move(){
        try{
            window.location.href = "task.html?name=" + localStorage.getItem('name') + "&noin=" + localStorage.getItem('no') + "&email=" + localStorage.getItem('email') + "&timer=" + localStorage.getItem('timer') +"&";
            }
            catch(err){

            }
        }
        function onSuccess(result){
  alert("Success:"+result);
}

function onError(result) {
  alert("Error:"+result);
}
  </script>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
    <title></title>

    <link rel="manifest" href="manifest.json">
    <link href="lib/ionic/css/ionic.css" rel="stylesheet">
    <link href="css/style.css" rel="stylesheet">
    <script src="lib/ionic/js/ionic.bundle.js"></script>
    <script src="cordova.js"></script>
    <script src="js/app.js"></script>
    <script src="js/controllers.js"></script>
    <script src="js/services.js"></script>
  </head>
  <body id="bod" ng-app="starter" ng-controller="MainCtrl">
  <div id="mainbutt" onclick="move()">
  &nbsp;
  </div>
  <div id="settings" onclick="location.href='settings.html'">
  &nbsp;
  </div>
  <a id="call" href="tel://Edited for privacy" ng-href="tel://Edited For Privacy" onclick="test()"><span id="callspan">CALL</span></a>
  </body>
</html>

config.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<widget id="com.ionicframework.loneworker957777" version="0.0.3" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:gap="http://phonegap.com/ns/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
  <name>LoneWorker</name>
  <description>
        An Ionic Framework and Cordova project.
    </description>
  <author email="you@example.com" href="http://example.com.com/">
      Your Name Here
    </author>
  <content src="index.html"/>
  <access origin="*"/>
  <allow-intent href="tel:*" launch-external="yes"/>
  <preference name="webviewbounce" value="false"/>
  <preference name="UIWebViewBounce" value="false"/>
  <preference name="DisallowOverscroll" value="true"/>
  <preference name="SplashScreenDelay" value="2000"/>
  <preference name="FadeSplashScreenDuration" value="2000"/>
  <preference name="android-minSdkVersion" value="16"/>
  <preference name="BackupWebStorage" value="none"/>
  <preference name="SplashScreen" value="screen"/>
  <feature name="StatusBar">
    <param name="ios-package" value="CDVStatusBar" onload="true"/>
  </feature>
  <feature name="NetworkStatus">
    <param name="android-package" value="CDVConnection"/>
  </feature>
  <platform name="ios">
    <icon src="resources\ios\icon\icon.png" width="57" height="57"/>
    <icon src="resources\ios\icon\icon@2x.png" width="114" height="114"/>
    <icon src="resources\ios\icon\icon-40.png" width="40" height="40"/>
    <icon src="resources\ios\icon\icon-40@2x.png" width="80" height="80"/>
    <icon src="resources\ios\icon\icon-40@3x.png" width="120" height="120"/>
    <icon src="resources\ios\icon\icon-50.png" width="50" height="50"/>
    <icon src="resources\ios\icon\icon-50@2x.png" width="100" height="100"/>
    <icon src="resources\ios\icon\icon-60.png" width="60" height="60"/>
    <icon src="resources\ios\icon\icon-60@2x.png" width="120" height="120"/>
    <icon src="resources\ios\icon\icon-60@3x.png" width="180" height="180"/>
    <icon src="resources\ios\icon\icon-72.png" width="72" height="72"/>
    <icon src="resources\ios\icon\icon-72@2x.png" width="144" height="144"/>
    <icon src="resources\ios\icon\icon-76.png" width="76" height="76"/>
    <icon src="resources\ios\icon\icon-76@2x.png" width="152" height="152"/>
    <icon src="resources\ios\icon\icon-83.5@2x.png" width="167" height="167"/>
    <icon src="resources\ios\icon\icon-small.png" width="29" height="29"/>
    <icon src="resources\ios\icon\icon-small@2x.png" width="58" height="58"/>
    <icon src="resources\ios\icon\icon-small@3x.png" width="87" height="87"/>
    <splash src="resources\ios\splash\Default-568h@2x~iphone.png" width="640" height="1136"/>
    <splash src="resources\ios\splash\Default-667h.png" width="750" height="1334"/>
    <splash src="resources\ios\splash\Default-736h.png" width="1242" height="2208"/>
    <splash src="resources\ios\splash\Default-Landscape-736h.png" width="2208" height="1242"/>
    <splash src="resources\ios\splash\Default-Landscape@2x~ipad.png" width="2048" height="1536"/>
    <splash src="resources\ios\splash\Default-Landscape~ipad.png" width="1024" height="768"/>
    <splash src="resources\ios\splash\Default-Portrait@2x~ipad.png" width="1536" height="2048"/>
    <splash src="resources\ios\splash\Default-Portrait~ipad.png" width="768" height="1024"/>
    <splash src="resources\ios\splash\Default@2x~iphone.png" width="640" height="960"/>
    <splash src="resources\ios\splash\Default~iphone.png" width="320" height="480"/>
  </platform>
  <platform name="android">
    <config-file target="AndroidManifest.xml">
      <uses-permission android:name="android.permission.SEND_SMS"/>
      <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
      <uses-permission android:name="android.permission.CALL_PHONE"/>
      <uses-permission android:name="android.permission.CAMERA"/>
      <uses-permission android:name="android.permission.CALL_PRIVILEGED"/>
      <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
      <uses-permission android:name="android.permission.INTERNET"/>
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
      <uses-permission android:name="android.permission_group.PHONE"/>
      <uses-permission android:name="android.permission.READ_CONTACTS"/>
      <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
      <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      <uses-feature android:name="android.software.sip" android:required="true"/>
      <uses-feature android:name="android.software.sip.voip" android:required="true"/>
      <uses-feature android:name="android.software.sip" android:required="true"/>
      <uses-feature android:name="android.hardware.telephony" android:required="false"/>
    </config-file>
    <icon src="resources\android\icon\drawable-ldpi-icon.png" density="ldpi"/>
    <icon src="resources\android\icon\drawable-mdpi-icon.png" density="mdpi"/>
    <icon src="resources\android\icon\drawable-hdpi-icon.png" density="hdpi"/>
    <icon src="resources\android\icon\drawable-xhdpi-icon.png" density="xhdpi"/>
    <icon src="resources\android\icon\drawable-xxhdpi-icon.png" density="xxhdpi"/>
    <icon src="resources\android\icon\drawable-xxxhdpi-icon.png" density="xxxhdpi"/>
    <splash src="resources\android\splash\drawable-land-ldpi-screen.png" density="land-ldpi"/>
    <splash src="resources\android\splash\drawable-land-mdpi-screen.png" density="land-mdpi"/>
    <splash src="resources\android\splash\drawable-land-hdpi-screen.png" density="land-hdpi"/>
    <splash src="resources\android\splash\drawable-land-xhdpi-screen.png" density="land-xhdpi"/>
    <splash src="resources\android\splash\drawable-land-xxhdpi-screen.png" density="land-xxhdpi"/>
    <splash src="resources\android\splash\drawable-land-xxxhdpi-screen.png" density="land-xxxhdpi"/>
    <splash src="resources\android\splash\drawable-port-ldpi-screen.png" density="port-ldpi"/>
    <splash src="resources\android\splash\drawable-port-mdpi-screen.png" density="port-mdpi"/>
    <splash src="resources\android\splash\drawable-port-hdpi-screen.png" density="port-hdpi"/>
    <splash src="resources\android\splash\drawable-port-xhdpi-screen.png" density="port-xhdpi"/>
    <splash src="resources\android\splash\drawable-port-xxhdpi-screen.png" density="port-xxhdpi"/>
    <splash src="resources\android\splash\drawable-port-xxxhdpi-screen.png" density="port-xxxhdpi"/>
  </platform>
  <platform name="wp8">
    <icon src="resources\wp8\icon\ApplicationIcon.png" width="99" height="99"/>
    <icon src="resources\wp8\icon\Background.png" width="159" height="159"/>
    <splash src="resources\wp8\splash\SplashScreenImage.png" width="768" height="1280"/>
  </platform>
  <icon src="resources\android\icon\drawable-xhdpi-icon.png"/>
</widget>

AndroidManifest.xml:

<?xml version='1.0' encoding='utf-8'?>
<manifest android:versionCode="3" android:versionName="0.0.3" package="com.ionicframework.loneworker957777" xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-feature android:name="android.hardware.telephony" android:required="false" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-feature android:name="android.software.sip" android:required="false" />
    <uses-feature android:name="android.software.sip.voip" android:required="false" />
    <uses-feature android:name="android.software.sip" android:required="false" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-feature android:name="android.hardware.telephony" android:required="false" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <application android:label="@string/app_name">
        <activity android:label="@string/activity_name" android:launchMode="singleTop" android:name="index">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="22" />
    <uses-permission android:name="android.permission_group.PHONE" />
</manifest>

EDIT: Should have clarified - for the phone call end I'm looking for my app to directly call a stated number using the CALL_PHONE permission from android, rather then opening the phonebook. The test function to click on the works correctly as far as opening the phonebook, but I want it to immediately begin the call.

EDIT2: Adding plugin.xml and permissions.java below since they relate to the android.permissions plugin.

Plugin.xml:

<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
        xmlns:android="http://schemas.android.com/apk/res/android"
        id="cordova-plugin-android-permissions"
        version="0.10.0">

  <name>Permissions</name>

  <description>Android permissions support library.</description>

  <author>Jason Yang</author>

  <engines>
    <engine name="cordova" version=">=5.0.0"/>
  </engines>

  <!-- android -->
  <platform name="android">
    <js-module src="www/permissions.js" name="Permissions">
      <clobbers target="cordova.plugins.permissions" />
    </js-module>

    <config-file target="res/xml/config.xml" parent="/*">
      <feature name="Permissions">
        <param name="android-package" value="com.android.plugins.Permissions" />
      </feature>
    </config-file>

    <source-file src="src/android/com/android/plugins/Permissions.java" target-dir="src/com/android/plugins"/>
  </platform>

</plugin>

permissions.java:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

            ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);
        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Comments are from the author, not from me btw.

Ok, I've resolved the error on my side.

First package.json in /package.json didn't build the "cordovaPlugins" correctly with only the default areas being added.

My old file had:

"cordova-plugin-whitelist",
"cordova-plugin-statusbar",
"cordova-plugin-console",
"cordova-plugin-device",
"cordova-plugin-splashscreen",

Now I've added:

"ionic-plugin-keyboard",
"cordova-plugin-android-permissions",
"cordova.plugins.diagnostic",
"cordova-plugin-settings-hook",
"cordova-plugin-statusbar",
"cordova-plugin-vibration",
"cordova-sms-plugin",
"call-number"

This resolved the permissions issue I was having immediately(using sdk 22 currently).

I then used the 'call-number's :

window.plugins.CallNumber.callNumber(onSuccess, onError, /*Put a String number here*/, true);

Which fixed the issue, thanks for help everyone.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM