小编an0*_*00b的帖子

如何以编程方式更改TTS默认引擎

除了Android附带的Pico TTS引擎外,我还安装了另一个TTS引擎.我可以更改系统使用的默认值 - 手动:

Settings > Voice input & output > Text-to-speech settings > Default Engine
Run Code Online (Sandbox Code Playgroud)

我希望能够在我的应用程序中以编程方式执行此操作.这可能吗?

如果是这样,我该怎么办呢?

android text-to-speech

15
推荐指数
2
解决办法
9094
查看次数

SCREEN_ORIENTATION_LANDSCAPE倒置 - 为什么?

我使用以下代码为每个用户首​​选项设置方向锁定:

 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)?

为了使这更清晰,更容易重现,以下是显示问题的步骤:

  1. 开始时手机向右旋转(顺时针),处于解锁模式(SCREEN_ORIENTATION_SENSOR),屏幕显示LANDSCAPE正确(!),
  2. 然后调用 doLock(true)
  3. 它不是将屏幕锁定到LANDSCAPE当前(正确)的横向视图中,而是锁定到倒置的横向视图.即同样精确但垂直翻转(y变为-y).

android android-sensors android-orientation

12
推荐指数
3
解决办法
1万
查看次数

在LogCat中显示Android线程ID

默认情况下,Eclipse上的LogCat显示5个信息列:

Time       Level  pid   tag message 
Run Code Online (Sandbox Code Playgroud)

是否可以添加第6列,显示线程ID

eclipse multithreading android logcat

11
推荐指数
1
解决办法
9861
查看次数

TTS的默认音频流是什么?

据我所知,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).是这个吗?

android text-to-speech android-audiomanager

11
推荐指数
1
解决办法
5622
查看次数

如何将参数传递给BroadcastReceiver的子类?

我按下时设法让我的应用程序识别我的耳机按钮,但其中一个按钮需要调用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的数据成员吗?

java android broadcastreceiver android-audiomanager

11
推荐指数
1
解决办法
3238
查看次数

带注释的Android类层次结构

对于我的生活,我看不到"大局".每当我想到我学到了一些关于Android的东西时,就会在一些示例/示例代码中弹出一个新类.

是的,我可以在(简洁的)正式引用中查找它,但我需要一些额外的东西:类层次结构图,它可以提醒我类之间的各种关系.像这样的东西.

理想情况下,我可以在纸上打印,以便在学习Android时始终在我的眼前.

某处有这样的图吗?

android class-diagram hierarchy

10
推荐指数
2
解决办法
5458
查看次数

ActivityNotFoundException(是,此活动在AndroidManifest.xml中声明)

我发现一些线程报告了类似的问题,但它们都没有真正提供我尚未尝试过的东西.

一个无辜的这样的电话:

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

android preferenceactivity android-manifest library-project

10
推荐指数
1
解决办法
1万
查看次数

在Eclipse中观察非常长的String内容

由于LogCat会截断长字符串,因此我使用FileOutputStream来检查非常长字符串的内容.

它可以工作,但它迫使我'adb pull'该文件,与在LogCat上观看它相比,这不是很方便.

Eclipse中有没有其他方法可以观看非常长的字符串?

eclipse debugging android android-emulator logcat

9
推荐指数
2
解决办法
8502
查看次数

Android TTS XML中phoneme属性的正确语法是什么?

我的理解是,这个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 text-to-speech ssml

9
推荐指数
1
解决办法
2222
查看次数

如何判断是否检查(启用)特定的TTS引擎?

此问题仅适用于Android 2.2:

以下屏幕截图显示了安装的3种不同的文本到语音引擎:

  1. PIco TTS(截至Froyo 2.2的Android默认版本)
  2. IVONA文字转语音总部
  3. SVOX Classic TTS

在此屏幕截图中,您可以看到并非所有3都已选中(已启用).相反,IVONA未经检查,仅留下Pico(暗示,因为它是硬编码的)和SVOX(已检查).

在此输入图像描述

我希望能够以编程方式从我的应用程序查询特定的TTS引擎(如IVONA)是否被选中(假设我知道在编码时的包名,当然).

在安卓2.2所有我是getDefaultEngine()不能在一个情况下真正帮助被选定为默认和SVOX检查(换句话说,我怎么知道SVOX如果被选中的Pico是默认?)

如何在Android 2.2中实现这一目标?

这是可能吗?

PS Android 4.x(API> = 14)引入了getEngines(),这可能会让您相信ICS +已经解决了这个问题,但仔细研究后发现:

  1. getEngines()仅列出已安装但未检查(已启用)的软件包.
  2. 每个列出的包附带的EngineInfo仅提供名称,标签,图标,优先级以及它是否是系统映像的一部分.换句话说,与Android 2.2中的限制相同.

android text-to-speech android-2.2-froyo

9
推荐指数
1
解决办法
2994
查看次数