Reputation: 317
I'm developing Marathi chatbot, in this I'm using Google Translator API and Speech to text. Till yesterday app was working fine but after restarting Android Studio, this error has occurred.
My app is working in AVD and only one device which is rooted. I tried in other 10 15 devices, the application shows error "Unfortunately App has stopped"
in.indekode.hrushi E/AndroidRuntime: FATAL EXCEPTION: main
Process: in.indekode.hrushi, PID: 7073
java.lang.NoSuchMethodError: No static method decodeBase64(Ljava/lang/String;)[B in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of 'org.apache.commons.codec.binary.Base64' appears in /system/framework/org.apache.http.legacy.boot.jar)
at com.google.api.client.util.Base64.decodeBase64(Base64.java:101)
at com.google.api.client.util.PemReader.readNextSection(PemReader.java:106)
at com.google.api.client.util.PemReader.readFirstSectionAndClose(PemReader.java:135)
at com.google.auth.oauth2.ServiceAccountCredentials.privateKeyFromPkcs8(ServiceAccountCredentials.java:296)
at com.google.auth.oauth2.ServiceAccountCredentials.fromPkcs8(ServiceAccountCredentials.java:286)
at com.google.auth.oauth2.ServiceAccountCredentials.fromJson(ServiceAccountCredentials.java:210)
at com.google.auth.oauth2.GoogleCredentials.fromStream(GoogleCredentials.java:174)
at com.google.auth.oauth2.GoogleCredentials.fromStream(GoogleCredentials.java:141)
at in.indekode.hrushi.MainActivity.initV2Chatbot(MainActivity.java:89)
at in.indekode.hrushi.MainActivity.onCreate(MainActivity.java:80)
at android.app.Activity.performCreate(Activity.java:6857)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6238)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
An error is showing at these lines,
initV2Chatbot();
and
GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
My mainactivity is
private static final String TAG = MainActivity.class.getSimpleName();
private static final int USER = 10001;
private static final int BOT = 10002;
private static final String API_KEY = "AIzaSyDoR8abbyu_4BKomJClKA2y1_Sn_M9PJ3A";
private String uuid = UUID.randomUUID().toString();
private LinearLayout chatLayout;
ImageButton voice_ibtn;
public String v_msg;
// TTS
final int RESULT_SPEECH = 100;
TextToSpeech mTextToSpeech;
// Java V2
private SessionsClient sessionsClient;
private SessionName session;
final Handler th = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ScrollView scrollview = findViewById(R.id.chatScrollView);
scrollview.post(() -> scrollview.fullScroll(ScrollView.FOCUS_DOWN));
voice_ibtn = findViewById(R.id.img_btn_voice);
chatLayout = findViewById(R.id.chatLayout);
initV2Chatbot();
showTextView("नमस्कार, मी तुमची मदत कशी करू शकतो?", BOT);
voice_ibtn.setOnClickListener(this::getVoiceInput);
}
private void initV2Chatbot() {
try {
InputStream stream = getResources().openRawResource(R.raw.test_agent_credentials);
GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
String projectId = ((ServiceAccountCredentials)credentials).getProjectId();
SessionsSettings.Builder settingsBuilder = SessionsSettings.newBuilder();
SessionsSettings sessionsSettings = settingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();
sessionsClient = SessionsClient.create(sessionsSettings);
session = SessionName.of(projectId, uuid);
} catch (Exception e) {
e.printStackTrace();
}
}
private void getVoiceInput(View view) {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "कृपया बाबाजीशी बोला...\n");
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
try{
startActivityForResult(intent, RESULT_SPEECH);
}
catch (ActivityNotFoundException e){
Toast.makeText(getApplicationContext(),"अरेरे! तुमचा मोबाइल मायक्रोफोनला समर्थन देत नाही..", Toast.LENGTH_SHORT).show();
}
}
@SuppressLint("StaticFieldLeak")
@Override
protected void onActivityResult(int requestCode, int resultcode, Intent data){
super.onActivityResult(requestCode, resultcode, data);
switch (requestCode) {
case RESULT_SPEECH: {
if (resultcode == RESULT_OK && null != data) {
ArrayList<String> text = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
v_msg = text.get(0);
if (v_msg.trim().isEmpty()) {
Toast.makeText(MainActivity.this, "Please enter your query!", Toast.LENGTH_LONG).show();
} else {
final AsyncTask<Void, Void, Void> de = new AsyncTask<Void, Void, Void>() {
@SuppressLint("WrongThread")
@Override
protected Void doInBackground(Void... voids) {
TranslateOptions options = TranslateOptions.newBuilder().setApiKey(API_KEY).build();
final Translate translate = options.getService();
final Translation translation = translate.translate(v_msg, Translate.TranslateOption.targetLanguage("en"));
th.post(new Runnable() {
@Override
public void run() {
String MrUserReply = translation.getTranslatedText();
showTextView(v_msg, USER);
// Java V2
QueryInput queryInput = QueryInput.newBuilder().setText(TextInput.newBuilder().setText(MrUserReply).setLanguageCode("en-US")).build();
new RequestJavaV2Task(MainActivity.this, session, sessionsClient, queryInput).execute();
}
});
return null;
}
}.execute();
}
}
break;
}
}
mTextToSpeech=new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR) {
mTextToSpeech.setLanguage(new Locale("mr","IND"));
}
}
});
}
@SuppressLint("StaticFieldLeak")
public void callbackV2(DetectIntentResponse response) {
if (response != null) {
// process aiResponse here
String botReply = response.getQueryResult().getFulfillmentText();
final AsyncTask<Void, Void, Void> de = new AsyncTask<Void, Void, Void>() {
@SuppressLint("WrongThread")
@Override
protected Void doInBackground(Void... voids) {
TranslateOptions options = TranslateOptions.newBuilder().setApiKey(API_KEY).build();
final Translate translate = options.getService();
final Translation translation = translate.translate(botReply, Translate.TranslateOption.targetLanguage("mr"));
th.post(new Runnable() {
@Override
public void run() {
String mrbotReply = translation.getTranslatedText();
Log.d(TAG, "Bot Reply: " + mrbotReply);
showTextView(mrbotReply, BOT);
}
});
return null;
}
}.execute();
} else {
Log.d(TAG, "Bot Reply: Null");
showTextView("There was some communication issue. Please Try again!", BOT);
}
}
private void showTextView(String message, int type) {
FrameLayout layout;
switch (type) {
case USER:
layout = getUserLayout();
break;
case BOT:
layout = getBotLayout();
break;
default:
layout = getBotLayout();
break;
}
layout.setFocusableInTouchMode(true);
chatLayout.addView(layout); // move focus to text view to automatically make it scroll up if softfocus
TextView tv = layout.findViewById(R.id.chatMsg);
tv.setText(message);
layout.requestFocus();
// queryEditText.requestFocus(); // change focus back to edit text to continue typing
}
FrameLayout getUserLayout() {
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
return (FrameLayout) inflater.inflate(R.layout.user_msg_layout, null);
}
FrameLayout getBotLayout() {
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
return (FrameLayout) inflater.inflate(R.layout.bot_msg_layout, null);
}
gradle file
android {
compileSdkVersion 28
defaultConfig {
applicationId "in.indekode.hrushi"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField 'String', "ClientAccessToken", CLIENT_ACCESS_TOKEN
resValue 'string', "ClientAccessToken", CLIENT_ACCESS_TOKEN
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField 'String', "ClientAccessToken", CLIENT_ACCESS_TOKEN
resValue 'string', "ClientAccessToken", CLIENT_ACCESS_TOKEN
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// Java V2
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/INDEX.LIST'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
// Dialogflow SDK dependencies
implementation 'ai.api:sdk:2.0.7@aar'
implementation 'ai.api:libai:1.6.12'
// Java V2
implementation 'com.google.cloud:google-cloud-dialogflow:0.67.0-alpha'
// for Remote Procedure Call to avoid "No functional channel service provider found" error while creating SessionsClient
implementation 'io.grpc:grpc-okhttp:1.15.1'
implementation('com.google.cloud:google-cloud-translate:1.62.0') {
exclude group: 'org.apache.httpcomponents'
exclude group: 'org.json', module: 'json'
}
annotationProcessor 'com.google.cloud:google-cloud-translate:1.62.0'
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:support-annotations:28.0.0'
}
gradle.properties file
org.gradle.jvmargs=-Xmx1536m
CLIENT_ACCESS_TOKEN="--my token no--"
Upvotes: 3
Views: 4635
Reputation: 21
implementation 'commons-codec:commons-codec:1.10'
private String decodeBase64(String data) {
byte[] bytes = new org.apache.commons.codec.binary.Base64().decode(StringUtils.getBytesUtf8(data));
return new String(bytes);
}
Upvotes: 2
Reputation: 4087
I'm not sure but I think you have excluded json in you gradle . so Please try to implement only com.google.cloud:google-cloud-translate
implementation('com.google.cloud:google-cloud-translate:1.62.0')
annotationProcessor 'com.google.cloud:google-cloud-translate:1.62.0'
Upvotes: 0
Reputation: 79
I think the problem lies in your GoogleCredentials Just see if they have been changed???? Just go and look for it...
Upvotes: 2
Reputation: 10546
create method decodeBase64
private String decodeBase64(String coded){
byte[] valueDecoded= new byte[0];
try {
valueDecoded = Base64.decode(coded.getBytes("UTF-8"), Base64.DEFAULT);
} catch (UnsupportedEncodingException e) {
}
return new String(valueDecoded);
}
Upvotes: 0