我正在使用 firebase 为 android 开发一个翻译应用程序。我发现了一个奇怪的行为,这个应用程序在我的 android 设备上运行良好,但在模拟器中却不行。
AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
构建.gradle:
implementation'com.google.firebase:firebase-core:15.0.2'
implementation 'com.google.firebase:firebase-ml-natural-language:22.0.0'
implementation 'com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7'
implementation 'com.google.firebase:firebase-ml-natural-language-translate-model:20.0.8'
翻译器.java:
public void translateText(int fromLanguage, int toLanguage, String input, Context context){
FirebaseTranslatorOptions options = new FirebaseTranslatorOptions.Builder()
.setSourceLanguage(fromLanguage)
.setTargetLanguage(toLanguage)
.build();
FirebaseTranslator universalTranslator = FirebaseNaturalLanguage.getInstance().getTranslator(options);
FirebaseModelDownloadConditions conditions = new FirebaseModelDownloadConditions.Builder()
.requireWifi()
.build();
universalTranslator.downloadModelIfNeeded(conditions).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(context, "Please wait language modal is being downloaded.", Toast.LENGTH_LONG).show();
universalTranslator.translate(input).addOnSuccessListener(new OnSuccessListener<String>() {
@Override
public void onSuccess(String s) {
mTranslatedText = s;
Toast.makeText(context, "Success", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(context, "Fail to translate", Toast.LENGTH_SHORT).show();
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(context, "Fail to download language modul", Toast.LENGTH_SHORT).show();
}
});
return;
}
Activity_1.java:
translator.translateText(languageFromCode,languageToCode, textToTranslate, context);
问题是,当我在我的真实设备上安装这个应用程序时,它会正常工作。当语言模型在真实设备上不可用时,它会自动下载并在几秒钟后使用。但是当我在模拟设备上运行完全相同的应用程序时,语言模型似乎没有正确下载。这是我已经想通的:
- 当语言模型不可用时,显然存在互联网流量,其中模拟器会下载一些东西。但是下载管理器中没有任何显示。
- 互联网流量返回 0 后,应用仍然认为语言模型不可用。而且翻译不工作。
- downloadModelifNeeded 的“addOnSuccessListener”和“addOnFailureListener”永远不会触发。所以没有吐司被生产出来
- 大约 15 分钟后,模拟设备上的应用程序终于可以工作了,我可以翻译了,所以语言模型可用
所以这是我的问题:有谁知道,什么可能导致模拟器上出现这种奇怪的行为,以及为什么应用程序在模拟器中无法正常工作?
请记住,该应用程序在真实设备上运行良好。