我认为我非常熟悉如何使用.gitignore(这对我来说排除顶级目录仍然很有用),但我现在发现R.java我的应用程序中使用的各个库中的多个文件正在被跟踪,我想停止跟踪它们.
我尝试将该行添加R.java到.gitignore顶级目录中,但git status不断将其报告为已修改.
然后我尝试将该行添加*/gen/到.gitignore顶级目录中,但git status仍然将它们报告为已修改.
告诉git停止跟踪它们的诀窍是什么?
我读过的Java教程,比如使用嵌套类来演示概念,特性或用法.
这使我最初实现了一个我创建的示例项目:主活动类中有很多嵌套类.
它工作,但现在我有一个可怕的单片.java文件.我发现它有点不方便,我现在打算打破多个.java文件/类.
然而,在我看来,有时可能有理由不从他们的封闭课堂上上课.
如果是这样,考虑到模块化和易维护性,保持模块大的原因是什么?
是否存在将嵌套类转换为顶级类是不切实际(甚至不可能)的情况?换句话说,是否只有嵌套类可以满足某些功能?
我的Android教程声明我可以明确告诉TTS引擎使用哪个流:
对于音乐播放:
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));
Run Code Online (Sandbox Code Playgroud)
并拨打电话:
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_VOICE_CALL));
Run Code Online (Sandbox Code Playgroud)
我的理解是,音频路由到蓝牙耳机的作品,从而STREAM_MUSIC去A2DP(在Android的蓝牙设置又名"媒体音频")和STREAM_VOICE_CALL去HSP(在Android的蓝牙设置又名"手机音频").
但不管我是否使用STREAM_MUSIC或STREAM_VOICE_CALL在我的小应用程序中,音频总是出于某种原因A2DP.
我做错了什么?有没有办法将TTS输出路由到耳机的HSP配置文件?
我梳理了AudioManager,找不到任何API或设置来从立体声切换到单声道(两个声道的信号都是两个立体声声道的总和).
完全可以在Android中实现这一点吗?
通过观察各种Android应用程序的源代码(不是我编写的),我注意到了将某些代码片段放入自己的方法中的模式,尽管实际上没有任何代码重用,因为这些方法只在整个过程中被调用一次应用.
到目前为止,我有一个经验法则,规定如果在应用程序代码中使用两次或更多代码,那么它就有其自身的方法,仅仅是为了消除代码冗余.
但是看到那些整齐地将代码块分解成自己的方法(以及自己的方法调用开销),我开始说,也许我错过了一些东西.
除了用于文档目的之外,还有什么其他原因可以证明只将4行代码(只调用一次!)放入自己的方法中?
在通过这个答案设法使TextToSpeech.setEngineByPackageName()工作之后,我现在遇到了"相反"的问题:
tts.setEngineByPackageName("com.ivona.tts.voicebeta.eng.usa.kendra");始终返回TextToSpeech.SUCCESS,即使该设备中根本没有安装该软件包.
由于设备上没有该软件包,TTS会继续使用Android的默认设置pico,这是预期的,但我不明白为什么要setEngineByPackageName()返回SUCCESS.
怎么会这样?
该文件说:"TTS引擎检查是否忙讲."
但我只是实现一个呼叫isSpeaking()中的onUtteranceCompletedListener,在那里我有至少10周悬而未决的言论和没有人做我收到true.
假设isSpeaking()实际上按照文档记录,我必须得出结论,我正在调用它.
调用TextToSpeech.isSpeaking()返回有效结果的要点是什么?
TextToSpeech有一种设置语音速率的方法:setSpeechRate()。但是它没有查询当前速度的相反方法。
有没有办法向系统查询该值?
我在Java中读到"构造函数不是继承的".
另一方面,我还读到如果我没有显式调用super,Java会自动调用没有参数的超类构造函数(在这种情况下必须存在这样的构造函数).
是不是自动调用超类构造函数(没有参数)的继承形式?
"构造函数不是继承的"究竟意味着什么?
我试图在onUtteranceCompleted()中从非UI线程创建一个对话框:
runOnUiThread(
new Thread(new Runnable() {
public void run() { MyDialog.Prompt(this); }
}).start());
Run Code Online (Sandbox Code Playgroud)
Prompt()是MyDialog类的一个简单的静态方法:
static public void Prompt(Activity activity) {
MyDialog myDialog = new MyDialog();
myDialog.showAlert("Alert", activity);
}
Run Code Online (Sandbox Code Playgroud)
问题是,我正在尝试做两件错误:
通过将对话框创建推迟到UI线程,我想要的只是"做对了",但似乎我遗漏了一些基本的东西.
我缺少什么,如何完成我想要实现的看似简单的任务?
android ×6
java ×3
audio ×1
bluetooth ×1
code-reuse ×1
dialog ×1
git ×1
gitignore ×1
modularity ×1
nested ×1
refactoring ×1
runnable ×1
ui-thread ×1