2016-12-08 2 views
0

처음으로 질문을 올리므로 미안합니다.이오니아 권한이 변경되지 않습니다. (안드로이드)

크로스 플랫폼 애플리케이션을 개발 중이며 현재 Android에서 테스트 중입니다. 그러나 기본 "전체 네트워크 액세스"권한을 제외한 모든 권한을 얻을 수 없습니다. 나는 특히 CALL_PHONE 권한을 얻으려고 노력하고 있지만 다른 사람들도 테스트하려고 노력하고있다.

나는 Cordova-plugins-android-permissions와 Cordova-plugins-diagnostic을 모두 사용하려고 시도했지만, 해당 페이지에서 예제 기능을 호출하지 못하는 것으로 보입니다 (경고 (cordova.plugins. 사용 권한)은 정의되지 않은 값을 반환합니다.

SDK 버전 22와 24에서 응용 프로그램을 시험해 보았습니다. 사전 마쉬멜로 (marshmallow)가 작동하는 권한을 얻을 수 있는지는 알 수 없었지만 영향을 미치지 않습니다 (자체 권한이 필요하지 않은 진동 권한이 포함되어 있음).

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

편집 : 명확히 했어야 - 나 '전화 통화 끝 m 내 앱이 안드로이드의 CALL_PHONE 권한을 사용하여 명시된 번호로 전화를 걸기를 원함 케이. 전화 번호부를 열 때까지 제대로 작동하는 테스트 기능이 있지만 즉시 통화를 시작하고 싶습니다.

EDIT2 : android.permissions 플러그인과 관련된 plugin.xml 및 permissions.java를 아래에 추가합니다.

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

댓글이 없습니다 BTW 내에서, 저자에서 있습니다.

+0

당신은 확실합니까 window.PhoneCaller.call 첫 번째 인수로 문자열을 걸립니까? 이 문서에 대한 링크가 있습니까? Object.call은 일반적으로 객체 또는 null을 가져옵니다. – chriskelly

+0

window.PhoneCaller.call은 https://github.com/codebakery/cordova-plugin-phonecaller에서 가져옵니다. 다른 플러그인으로 시도했으나 사용 권한이 없으면 시도 할 수 없습니다. 직접 전화를 걸면 test()가 숫자가 첨부 된 전화 번호부를 불러 와서 제대로 작동합니다. 그러나 CALL_PHONE 권한을 사용하여 직접 호출 할 수 있어야합니다 (원본을 미안하게 명시해야 함). 편집을 추가합니다. –

+0

플러그인을 설치했다고 가정하면 (config.xml에서 볼 수는 없으므로 아마도 --save 플래그가 없으므로) 일반적으로 플러그인의 plugin.xml에서 사용 권한을 기대합니다. ''과 같은 것입니다. 그러나 거기에는 없으며이 플러그인은 버전 0.0.2입니다. 다른 플러그인을 찾거나이 플러그인을 포크하여 plugin.xml을 직접 조정하십시오. – JanP

답변

0

내 옆에있는 오류를 해결했습니다.

/package.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); 

문제를 해결, 감사 :

나는 다음 '전화 번호의 사용.

관련 문제