2016-12-08 4 views
0

Впервые задал вопрос здесь, извините, если я пропущу что-нибудь.Ионные разрешения не будут меняться (андроид)

Я пытаюсь разработать кросс-платформенное приложение и в настоящее время тестирую на android, однако я не могу получить никаких разрешений, исключая разрешение «полного доступа к сети» по умолчанию. Я пытаюсь получить разрешение CALL_PHONE, но пытаюсь проверить и других.

Я попытался использовать как Кордова-плагины-андроид-разрешения, так и диагностику Cordova-plugins, однако кажется, что они не могут вызвать примерные функции на своих страницах (также предупреждают (cordova.plugins. разрешений) возвращает undefined).

Я пробовал приложение в обеих версиях SDK 22 и 24, чтобы узнать, могу ли я получить разрешения, работающие с предварительным зефиром, но без эффекта (это включает в себя виброзвонок, который, по-видимому, не нуждается в его собственном запросе).

Я прилагаю свой index.html (моя основная страница), config.xml и androidmanifest.xml ниже.

Заранее спасибо.

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="[email protected]" 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\[email protected]" width="114" height="114"/> 
    <icon src="resources\ios\icon\icon-40.png" width="40" height="40"/> 
    <icon src="resources\ios\icon\[email protected]" width="80" height="80"/> 
    <icon src="resources\ios\icon\[email protected]" width="120" height="120"/> 
    <icon src="resources\ios\icon\icon-50.png" width="50" height="50"/> 
    <icon src="resources\ios\icon\[email protected]" width="100" height="100"/> 
    <icon src="resources\ios\icon\icon-60.png" width="60" height="60"/> 
    <icon src="resources\ios\icon\[email protected]" width="120" height="120"/> 
    <icon src="resources\ios\icon\[email protected]" width="180" height="180"/> 
    <icon src="resources\ios\icon\icon-72.png" width="72" height="72"/> 
    <icon src="resources\ios\icon\[email protected]" width="144" height="144"/> 
    <icon src="resources\ios\icon\icon-76.png" width="76" height="76"/> 
    <icon src="resources\ios\icon\[email protected]" width="152" height="152"/> 
    <icon src="resources\ios\icon\[email protected]" width="167" height="167"/> 
    <icon src="resources\ios\icon\icon-small.png" width="29" height="29"/> 
    <icon src="resources\ios\icon\[email protected]" width="58" height="58"/> 
    <icon src="resources\ios\icon\[email protected]" width="87" height="87"/> 
    <splash src="resources\ios\splash\[email protected]~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\[email protected]~ipad.png" width="2048" height="1536"/> 
    <splash src="resources\ios\splash\Default-Landscape~ipad.png" width="1024" height="768"/> 
    <splash src="resources\ios\splash\[email protected]~ipad.png" width="1536" height="2048"/> 
    <splash src="resources\ios\splash\Default-Portrait~ipad.png" width="768" height="1024"/> 
    <splash src="resources\ios\splash\[email protected]~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: Если бы уточнить - в конце телефонного звонка I» m ищет приложение для прямого вызова указанного номера с помощью разрешения CALL_PHONE от android, а не открытия phoneboo к. Функция тестирования позволяет правильно щелкнуть по работам, открыв телефонную книгу, но я хочу, чтобы она немедленно начала вызов.

EDIT2: добавление plugin.xml и permissions.java ниже, поскольку они относятся к плагину android.permissions.

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. 
    } 
} 

Комментарии являются от автора, а не от меня кстати.

+0

Вы уверены, что window.PhoneCaller.call принимает строку в качестве первого аргумента? У вас есть ссылка на документацию для этого? Object.call обычно принимает это, объект или null – chriskelly

+0

window.PhoneCaller.call происходит из https://github.com/codebakery/cordova-plugin-phonecaller - другого плагина, который я пробовал в качестве обойти, но без разрешений я не могу звоните напрямую, тест() работает правильно, создавая телефонную книгу с прикрепленным номером. Однако мне нужно, чтобы он мог звонить напрямую, используя разрешение CALL_PHONE (должно было уточнить это в оригинале, извините, я добавлю редактирование). –

+0

Предполагая, что вы установили плагин (я не вижу его в вашем файле config.xml, поэтому, возможно, без флага -save), я обычно ожидал бы разрешения в plugin.xml плагина. Что-то вроде ''. Но его нет, и этот плагин имеет версию 0.0.2. Может быть, найти другой плагин или развить этот плагин, внеся свои собственные настройки в plugin.xml. – JanP

ответ

0

Хорошо, я разрешил ошибку на моей стороне.

Первый пакет.json в /package.json правильно не построил «cordovaPlugins», добавив только добавляемые по умолчанию области.

Мой старый файл был:

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

Теперь я добавил:

"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" 

Это решило проблему разрешений я сразу, имеющий (с использованием SDK 22 в настоящее время).

Затем я использовал «звонок-номер модели:

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

Какой исправил проблему, спасибо за помощь всем.

Смежные вопросы