Android 禁用应用程序中特定活动的权限

Android 禁用应用程序中特定活动的权限,android,speech-recognition,voice-recognition,speech,Android,Speech Recognition,Voice Recognition,Speech,我正在创建一个简单的应用程序。我目前发现,当我打开我的应用程序时,.gradle文件夹中设置了以下权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.per

我正在创建一个简单的应用程序。我目前发现,当我打开我的应用程序时,
.gradle
文件夹中设置了以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

我已经找到了另一种方法,将以下内容添加到我的清单文件
android:noHistory=“true”
这似乎可以清除主活动堆栈的历史记录,现在onClickListener正在第二个活动中工作

另一种方法是将以下内容放在我的MainActivity文件的底部,这是@brandall建议的
onPause
方法:

@Override
protected void onPause() {
super.onPause();
finish();
}

我已经找到了另一种方法,将以下内容添加到我的清单文件
android:noHistory=“true”
这似乎可以清除主活动堆栈的历史记录,现在onClickListener正在第二个活动中工作

另一种方法是将以下内容放在我的MainActivity文件的底部,这是@brandall建议的
onPause
方法:

@Override
protected void onPause() {
super.onPause();
finish();
}
我在评论中说:


使用
noHistory
不是一个解决方案,它只是碰巧在大多数情况下起作用。当您的应用程序不再位于前台时,由于收到来电等原因,您不希望您的用户体验丢失,而是希望它暂停。正确管理onPause和onResume是一项基本要求,使用
noHistory
可以暂时避免

下面是一个示例,说明在应用程序暂停并随后恢复时如何管理
识别器
对象

@Override
protected void onResume() {
    super.onResume();

    if (recognizer == null) {
        // Set up recognizer again
    }
}

@Override
protected void onPause() {
    super.onPause();

    if (recognizer != null) {
        recognizer.cancel();
        recognizer.shutdown();
        recognizer = null;
    }
}
虽然每次暂停时都会销毁应用程序,但这将解决释放麦克风和识别器资源的解决方案,这不是您想要做的-您想要优雅地管理应用程序的生命周期,让其进入后台并再次进入前台,而无需保留资源(如麦克风)导致其他应用程序出现问题。

在我的评论中,我说:


使用
noHistory
并不是一个解决方案,它只是在大多数情况下碰巧起作用。当您的应用程序不再位于前台时,由于诸如接到来电等原因,您不希望您的用户体验丢失,您希望它处于暂停状态。正确管理onPause和onResume是一项基本要求nt,使用
noHistory
将暂时避免

下面是一个示例,说明在应用程序暂停并随后恢复时如何管理
识别器
对象

@Override
protected void onResume() {
    super.onResume();

    if (recognizer == null) {
        // Set up recognizer again
    }
}

@Override
protected void onPause() {
    super.onPause();

    if (recognizer != null) {
        recognizer.cancel();
        recognizer.shutdown();
        recognizer = null;
    }
}

虽然每次暂停时都会销毁应用程序,但这将解决释放麦克风和识别器资源的解决方案,这不是您想要做的-您想要优雅地管理应用程序的生命周期,让其进入后台并再次进入前台,而无需保留资源(例如麦克风)导致其他应用程序出现问题。

为了使用麦克风,您需要录制音频,这是一项要求。您不能没有录制语音的权限,如果需要将其发送到云端,那么您还需要互联网。根据您运行的安卓版本的不同,这项要求也会有所不同M已经更改了权限结构。如果它早于android M,则您根本无法在运行时更改权限。还要确保清理您的资源。听起来您没有在主活动中释放麦克风资源。您可能需要发布相关的源代码。我已经发布了主活动的源代码,第二个顺便说一句,我在Nexus6p(安卓M)上运行的是一个简单的语音到文本的活动抱歉,我看到您后来删除了源代码,并认为您已经解决了问题…正如我在前面的评论中提到的,您没有释放麦克风资源。例如,尝试在
onResume()
中初始化语音识别器,并在
onPause()
onestroy()中取消/销毁它
将不会被调用,直到您的主要活动从堆栈中完全移除。使用
noHistory
不是一个解决方案,它只是在大多数情况下碰巧起作用。当您的应用程序不再位于前台时,由于收到来电等原因,您不希望您的用户体验丢失,您希望它暂停。Correct管理
onPause
onResume
是一项基本要求,使用
noHistory
可以暂时避免。为了使用麦克风,您需要录制音频,这是一项要求。您不能没有语音录制权限,如果需要发送到cloud,那么你也需要互联网。根据你正在运行的android版本的不同,它会有所不同,因为android M已经更改了权限结构。如果是在android M之前,你根本无法在运行时更改权限。还要确保清理你的资源。听起来你没有在主a中释放麦克风资源活动。你可能想发布相关的源代码。我已经发布了主要活动的源代码,第二个活动目前只是一个简单的语音到文本活动,顺便说一句,我正在运行Nexus 6p(Android M)抱歉,我看到您后来删除了源代码,并认为您已经解决了问题…正如我在前面的评论中提到的,您没有释放麦克风资源。例如,尝试在
onResume()
中初始化语音识别器,并在
onPause()
onestroy()中取消/销毁它
将不会被调用,直到您的主要活动从堆栈中完全移除。使用
noHistory
不是一个解决方案,它只是在大多数情况下碰巧起作用。当您的应用程序不再处于前台时,由于收到来电等原因,您不希望您的用户体验丢失,而是希望它丢失