问题描述
在Web或应用程序中启用该功能时,该技能需要一个许可(出站通知)。但是,在实施Skill Enabled Event后,它并没有要求用户授予通知权限。技能启用本身可以工作,但默认情况下是许可,否。通过语音启用时如何使alexa寻求许可?
skill.json
{
"manifest": {
"publishinginformation": {
"locales": {
"en-US": {
"summary": "test skill summary","examplePhrases": [
"Alexa,launch test skill","Alexa,open test skill",start test skill"
],"keywords": [
"test skill"
],"name": "test skill","description": "test skill Description","smallIconUri": "","largeIconUri": "","updatesDescription": ""
}
},"isAvailableWorldwide": true,"testingInstructions": "n/a","category": "EVENT_FINDERS","distributionCountries": [],"automaticdistribution": {
"isActive": false
}
},"apis": {
"custom": {
"endpoint": {
"uri": "arn:aws:lambda:us-east-1:"
},"interfaces": []
}
},"manifestVersion": "1.0","privacyAndCompliance": {
"allowsPurchases": false,"locales": {
"en-US": {
"privacyPolicyUrl": "","termsOfUseUrl": ""
}
},"isExportCompliant": true,"containsAds": false,"isChildDirected": false,"usesPersonalInfo": false
},"events": {
"endpoint": {
"uri": "arn:aws:lambda:us-east-1:"
},"publications": [
{
"eventName": "AMAZON.MessageAlert.Activated"
},{
"eventName": "AMAZON.MediaContent.Available"
}
],"regions": {
"NA": {
"endpoint": {
"uri": "arn:aws:lambda:us-east-1:","sslCertificateType": "Trusted"
}
}
},"subscriptions": [
{
"eventName": "SKILL_PROACTIVE_SUBSCRIPTION_CHANGED"
},{
"eventName": "SKILL_ENABLED"
},{
"eventName": "SKILL_disABLED"
},{
"eventName": "SKILL_PERMISSION_ACCEPTED"
},{
"eventName": "SKILL_PERMISSION_CHANGED"
},{
"eventName": "SKILL_ACCOUNT_LINKED"
}
]
},"permissions": [
{
"name": "alexa::devices:all:notifications:write"
}
]
}
}
感谢您的帮助
解决方法
可能有不同的方法,但是一旦我掌握了技能,我相信您将需要发送许可卡。据我了解,其想法是确保亚马逊作为第三方权限授予者参与其中。这将在用户手机上的Alexa应用程序中弹出权限请求。这种增加的安全性层只是确保客户能够确切地看到他们所授予的权限。
您可以通过几种不同的方法来做到这一点。您可以检查用户的第一次连接,并在持久客户数据层中跟踪该第一次连接。或者,您可以仅在使用该技能的那部分时检查用户是否具有权限。如果他们没有回应,告诉客户您已向他们发送了一张卡片以授予权限。
,要通过lambda运行提醒,其他权限可能是相同的格式。
const CreateReminderIntent = {
canHandle(handlerInput) {
const { request } = handlerInput.requestEnvelope;
return request.type === 'IntentRequest' && request.intent.name === 'CreateReminderIntent';
},async handle(handlerInput) {
const { requestEnvelope,serviceClientFactory,responseBuilder } = handlerInput;
const consentToken = requestEnvelope.context.System.user.permissions
&& requestEnvelope.context.System.user.permissions.consentToken;
if (!consentToken) {
return handlerInput.responseBuilder
.addDirective({
type: "Connections.SendRequest",name: "AskFor",payload: {
"@type": "AskForPermissionsConsentRequest","@version": "1","permissionScope": "alexa::alerts:reminders:skill:readwrite"
},token: "<string>"
})
.getResponse();
}
try {
const speechText = "Great! I've scheduled a reminder for you";
const ReminderManagementServiceClient = serviceClientFactory.getReminderManagementServiceClient();
const reminderPayload = {
"trigger": {
"type": "SCHEDULED_RELATIVE","offsetInSeconds": "10","timeZoneId": "Europe/London"
},"alertInfo": {
"spokenInfo": {
"content": [{
"locale": "en-GB","text": "Wash the dog"
}]
}
},"pushNotification": {
"status": "ENABLED"
}
};
await ReminderManagementServiceClient.createReminder(reminderPayload);
return responseBuilder
.speak(speechText)
.getResponse();
} catch (error) {
console.error(error);
return responseBuilder
.speak('Uh Oh. Looks like something went wrong.')
.getResponse();
}
}
};