除了Android附带的Pico TTS引擎外,我还安装了另一个TTS引擎.我可以更改系统使用的默认值 - 手动:
Settings > Voice input & output > Text-to-speech settings > Default Engine
Run Code Online (Sandbox Code Playgroud)
我希望能够在我的应用程序中以编程方式执行此操作.这可能吗?
如果是这样,我该怎么办呢?
我使用以下代码为每个用户首选项设置方向锁定:
private void doLock(boolean locked) {
if (locked) {
int o = getResources().getConfiguration().orientation;
if (o == Configuration.ORIENTATION_LANDSCAPE)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
else if (o == Configuration.ORIENTATION_PORTRAIT)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
Run Code Online (Sandbox Code Playgroud)
它的工作原理,除了我处于解锁模式(SCREEN_ORIENTATION_SENSOR)的情况下屏幕显示LANDSCAPE正确(!),然后调用doLock(true)和...
而不是屏幕锁定到LANDSCAPE其当前(正确)横向视图,它锁定到倒置的横向视图.即同样精确但垂直翻转(y变为-y).
为什么这样,我如何处理这个问题才能解决它?
我的初步调查显示除了常见的两个(,)之外还有很多其他可能性,包括,但是我的预感告诉我这个问题可能取决于设备,所以通过使用它我可能只是为我的手机修复问题但不适用于所有其他设备.portraitlandscapereverseLandscape
有没有办法在所有设备中强制正确landscape定位(切换时sensor)?
为了使这更清晰,更容易重现,以下是显示问题的步骤:
SCREEN_ORIENTATION_SENSOR),屏幕显示LANDSCAPE正确(!),doLock(true)LANDSCAPE当前(正确)的横向视图中,而是锁定到倒置的横向视图.即同样精确但垂直翻转(y变为-y).默认情况下,Eclipse上的LogCat显示5个信息列:
Time Level pid tag message
Run Code Online (Sandbox Code Playgroud)
是否可以添加第6列,显示线程ID?
据我所知,Android目前有7个音频流:
STREAM_ALARM (for alarms)
STREAM_DTMF (for DTMF Tones)
STREAM_MUSIC (for music playback)
STREAM_NOTIFICATION (for notifications)
STREAM_RING (for the phone ring)
STREAM_SYSTEM (for system sounds)
STREAM_VOICE_CALL (for phone calls)
Run Code Online (Sandbox Code Playgroud)
我也知道可以明确告诉TTS引擎使用哪个流:
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));
mTts.speak(text, TextToSpeech.QUEUE_ADD, params);
Run Code Online (Sandbox Code Playgroud)
但是,我没有找到的是当我没有指定音频流时默认使用的流.
Android的TextToSpeech引擎的默认音频流是什么?
有没有办法查询Android的TextToSpeech引擎当前正在使用哪个流?
UPDATE: TextToSpeech.Engine有一个常量定义为DEFAULT_STREAM,但不清楚它所引用的7个流中的哪一个.但它具有与STREAM_MUSIC相同的十六进制值(0x3).是这个吗?
我按下时设法让我的应用程序识别我的耳机按钮,但其中一个按钮需要调用MyCustomActivity中的方法.问题是onReceive的第一个参数是一个不能强制转换为Activity的Context,并且使用MyCustomActivity的内部类 在Android 4.1中不起作用,除非它是静态的(具有无法访问MyCustomActivity方法的相同问题).
所以我唯一的选择(为了支持2.x和4.1)是将活动作为参数传递给RemoteControlReceiver.
但是,如何实现它的唯一方法是通过:
private ComponentName mRemoteControlReceiver = new ComponentName(this, RemoteControlReceiver.class);
Run Code Online (Sandbox Code Playgroud)
哪个不接受任何其他参数?
任何想法如何解决这个限制?
注意:如果我尝试定义RemoteControlReceiver具有参数的构造函数,则会收到以下异常:
E/AndroidRuntime(2836): java.lang.RuntimeException: Unable to instantiate receiver com.example.RemoteControlReceiver: java.lang.InstantiationException: can't instantiate class com.example.RemoteControlReceiver; no empty constructor
Caused by:
E/AndroidRuntime(2836): Caused by: java.lang.InstantiationException: can't instantiate class com.example.RemoteControlReceiver; no empty constructor
E/AndroidRuntime(2836): at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime(2836): at java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime(2836): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2205)
Run Code Online (Sandbox Code Playgroud)
很明显,这个新的registerMediaButtonEventReceiver要求(在Android 4.1中引入)需要一个空的构造函数.
有没有办法解决这个问题?
例如,有没有办法获得对实际RemoteControlReceiver对象的引用(通过间接实例化mAudioManager.registerMediaButtonEventReceiver())?这样我可以使用访问器在实例化后设置RemoteControlReceiver的数据成员吗?
我发现一些线程报告了类似的问题,但它们都没有真正提供我尚未尝试过的东西.
一个无辜的这样的电话:
mActivity.startActivity(new Intent(mActivity, MyEditPreferences.class));
Run Code Online (Sandbox Code Playgroud)
在AndroidManifest.xml中使用以下内容:
<application>
<activity android:name="MyActivityLib" />
<activity android:name="com.example.baseapp.MyEditPreferences" android:label="@string/app_name">
</activity>
</application>
Run Code Online (Sandbox Code Playgroud)
触发以下异常:
06-14 14:06:50.297: ERROR/AndroidRuntime(9272):
android.content.ActivityNotFoundException: Unable to find explicit activity class
{com.example.baseapp.paypal/com.example.baseapp.MyEditPreferences};
have you declared this activity in your AndroidManifest.xml?
Run Code Online (Sandbox Code Playgroud)
问题是,在将代码从单个应用程序项目更改为由库项目和应用程序项目组成的由两部分组成的项目之前,此代码用于完美地工作.
AndroidManifest.xml是库项目中的一个.
我需要做什么来消除这个ActivityNotFoundException?
由于LogCat会截断长字符串,因此我使用FileOutputStream来检查非常长字符串的内容.
它可以工作,但它迫使我'adb pull'该文件,与在LogCat上观看它相比,这不是很方便.
Eclipse中有没有其他方法可以观看非常长的字符串?
我的理解是,这个X-SAMPA XML样本,就像这里的其他样本一样,甚至在这里和这里,都应该听起来像是什么.
String text = "<speak xml:lang=\"en-US\"> <phoneme alphabet=\"xsampa\" ph=\"faIv\"/>.</speak>";
mTts.speak(text, TextToSpeech.QUEUE_ADD, null);
Run Code Online (Sandbox Code Playgroud)
然而,由于一些奇怪的原因,它没有说什么(完全沉默).
我错过了什么?
为了澄清:我的TTS示例应用程序设置正常:如果我.在该</speak>标记之前将其更改为任何单词,Android TTS只是说这个单词很好.我唯一的问题是我无法以<phoneme alphabet=\"xsampa\" ph=\"faIv\"/>任何方式利用它.
我知道a .应该是静默的,但根据这些样本的海报,它应该是XML中的XSAMPA音素.我错过了什么?
此问题仅适用于Android 2.2:
以下屏幕截图显示了安装的3种不同的文本到语音引擎:
在此屏幕截图中,您可以看到并非所有3都已选中(已启用).相反,IVONA未经检查,仅留下Pico(暗示,因为它是硬编码的)和SVOX(已检查).

我希望能够以编程方式从我的应用程序查询特定的TTS引擎(如IVONA)是否被选中(假设我知道在编码时的包名,当然).
在安卓2.2所有我是getDefaultEngine()不能在一个情况下真正帮助碧被选定为默认和SVOX检查(换句话说,我怎么知道SVOX如果被选中的Pico是默认?)
如何在Android 2.2中实现这一目标?
这是可能吗?
PS Android 4.x(API> = 14)引入了getEngines(),这可能会让您相信ICS +已经解决了这个问题,但仔细研究后发现: