【问题标题】:Hard-coding a subset of Android source code (TextToSpeech) into an app将 Android 源代码 (TextToSpeech) 的子集硬编码到应用程序中
【发布时间】:2020-05-27 04:03:26
【问题描述】:

作为一个实验,并且作为一种强迫自己了解 tts 在 Android 上的工作原理的方法,我认为将 TextToSpeech 类的源代码复制到我的项目中的一个新类中可能会很有趣,并且将它(以及它的包名)重命名为我的项目。

这当然会导致许多类以红色突出显示,并且需要重新附加并带入我的项目中。

所以我开始重复相同的过程——将每个缺失类的源代码复制到我项目中的一个新类中——这会导致新类中缺失更多类。

我期待这些错误会发生,但理论上我希望有可能将整个 android.tts.* “树”(或任何必要的部分,以使 TextToSpeech 类函数)移植到我的项目。

这是我的代码来说明:

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    // notice that this not android.speech.tts.TextToSpeech class, but a local copy of it.
    MyTextToSpeech tts; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tts = new MyTextToSpeech(getApplicationContext(), new MyTextToSpeech.OnInitListener() {
            @Override
            public void onInit(int i) {
                if (i == TextToSpeech.SUCCESS) {
                    begin();
                }
                else {
                    Log.i("XXX", "init failed");
                }
            }
        }, "com.google.android.tts");
    }

    private void begin() {
        Log.i("XXX", "It seems to have initialized!");
    }
}

我已经消除了我的“自定义”TextToSpeech 类中的大部分错误(请假设这个错误是唯一剩下的错误),但是有一个类我似乎无法纳入项目:ITextToSpeechService:

显然这是一个隐藏/内部“aidl”文件,其来源是here

我尝试将它粘贴到一个名为“aidl”的新文件夹中(在this 回答之后),它“有效”,因为它存在于aidl 文件夹中而没有错误,但是当尝试使用 gradle\tasks 编译它时\other\compileDebugAidl,我收到了这个错误:

FAILURE:构建失败并出现异常。

  • 出了什么问题: 任务 ':app:compileDebugAidl' 执行失败。

工人提出了 1 个异常: java.lang.RuntimeException:java.lang.RuntimeException:java.io.IOException:com.android.ide.common.process.ProcessException:执行进程时出错/Users/boober/Library/Android/sdk/build-tools/28.0 .3/aidl 带参数 {-p/Users/boober/Library/Android/sdk/platforms/android-29/framework.aidl -o/Users/boober/Desktop/SCRAP/TTSGraft/app/build/generated/aidl_source_output_dir/调试/输出 -I/Users/boober/Desktop/SCRAP/TTSGraft/app/src/main/aidl -I/Users/boober/Desktop/SCRAP/TTSGraft/app/src/debug/aidl -I/Users/boober/ .gradle/caches/transforms-2/files-2.1/1cd7eff88f5e86d0249af2958bf465f0/core-1.1.0/aidl -I/Users/boober/.gradle/caches/transforms-2/files-2.1/929ec10604c047a76453df3294ada60ae/versionedparcelable-11. aidl -d/var/folders/vz/d68y33c14pjc9m2vrkqp2kvc0000gn/T/aidl4956045951058849495.d /Users/boober/Desktop/SCRAP/TTSGraft/app/src/main/aidl/com/booberbunz/ttsgraft/ITextToSpeechService.aidl}

...它仍然无法在 MyTextToSpeech.java 中解析。

如何在本地将此文件放入我的项目中,以便不再出现如图所示的红色“无法解决错误”?

另外一个问题:这实际上不可能——将 tts 硬编码到项目中吗?

谢谢。

【问题讨论】:

    标签: android android-studio compiler-errors android-source aidl


    【解决方案1】:

    我刚刚将这些 AIDL 添加到项目中并编译它们。我刚刚添加了 ITextToSpeechService.aidl 和 ITextToSpeechCallback.aidl 并删除了导入、修改包并将 ITextToSpeechCallback 导入添加到 ITextToSpeechService:

    import com.android.speech.tts.ITextToSpeechCallback; 
    

    我的文件在 src/main/aidl/com/android/speech/tts 所以 AIDLs 中的包是:

    package com.android.speech.tts;
    

    【讨论】:

    • 我并不是要提出一个令人困惑的问题...如果是这种情况,我会尝试编辑我的问题。我知道这可能看起来很奇怪/毫无意义,但我练习的重点是 not 从 com.android.speech.tts.* 导入任何内容,而是将代码实际复制并粘贴到我的项目中并将包重命名为我自己的......希望它仍然可以编译/运行。
    • 我没有从 android 本身导入任何东西。我刚刚添加了一个名称与 android 包装完全相同的包。我将 AIDL 添加到我的项目中,它们具有与 android 中的完全相同的包装,以防它稍后在 IPC 中相关。我导入的其实是我自己添加的AIDL文件。您可以使用任何您喜欢的包添加它并将 ITextToSpeechCallback.aidl 导入 ITextToSpeechService.aidl 并删除两者中的其他导入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多