【发布时间】:2017-04-23 18:00:48
【问题描述】:
第一次在这里提问,如有遗漏,敬请见谅。
我正在尝试开发一个跨平台应用程序,目前正在android上进行测试,但是,除了默认的“完全网络访问”权限外,我无法获得任何权限。我正在尝试专门获得 CALL_PHONE 权限,但也一直在尝试测试其他人。
我尝试同时使用 Cordova-plugins-android-permissions 和 Cordova-plugins-diagnostic 但是,他们似乎无法在他们的页面上调用示例函数(也是 alert(cordova.plugins.permissions ) 返回未定义)。
我已经在 SDK 版本 22 和 24 中尝试了该应用程序,看看我是否可以获得在棉花糖前工作的权限,但没有效果(这包括显然不需要它自己的请求的振动权限)。
我在下面附上了我的 index.html(我的主页)、config.xml 和 androidmanifest.xml。
提前致谢。
索引.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()">
</div>
<div id="settings" onclick="location.href='settings.html'">
</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>
编辑:应该澄清 - 对于电话结束,我正在寻找我的应用程序使用 android 的 CALL_PHONE 权限直接呼叫指定的号码,而不是打开电话簿。就打开电话簿而言,点击测试功能正常工作,但我希望它立即开始通话。
EDIT2:在下面添加 plugin.xml 和 permissions.java,因为它们与 android.permissions 插件有关。
插件.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.
}
}
评论来自作者,而不是我。
【问题讨论】:
-
你确定 window.PhoneCaller.call 将字符串作为第一个参数吗?你有这个文档的链接吗? Object.call 通常接受 this,一个对象或 null
-
window.PhoneCaller.call 来自github.com/codebakery/cordova-plugin-phonecaller - 我尝试过的另一个插件,但是没有权限我无法直接调用,test() 通过调出电话簿正常工作附号码。但是我需要它能够使用 CALL_PHONE 权限直接调用(应该在原文中澄清这一点,对不起,我会添加一个编辑)。
-
假设您安装了插件(我在您的 config.xml 中看不到它,所以可能没有 --save 标志),我通常希望在 plugin.xml 的权限插入。像
<uses-permission android:name="android.permission.CALL_PHONE" />这样的东西。但它不存在,而且这个插件的版本是 0.0.2。也许找到另一个插件,或者分叉这个插件并对 plugin.xml 进行自己的调整。 -
刚刚再次测试,` npm install cordova-plugin-android-permissions --save `对我的 config.xml 文件没有任何更改。进入 android 权限插件的 plugin.xml 文件,它似乎链接到一个带有一些附加 if/else 语句的 permissions.java 文件,我将这些链接到主体上的另一个编辑中。
-
好的,快速更新,我发现我的插件显示在 cordova plugins ls 下 - 但不在 package.json 中,在添加插件后,我已经获得了我请求的权限,仍在测试代码虽然自从它开始破坏我的javascript(wait()不再定义?)
标签: android xml cordova ionic-framework permissions