mr.volatile
mr.volatile

Reputation: 317

NoSuchMethodError: No static method decodeBase64

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

Answers (4)

yachao zhang
yachao zhang

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

Tejas Pandya
Tejas Pandya

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

Gursewak Dhindsa
Gursewak Dhindsa

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

Abdulla Thanseeh
Abdulla Thanseeh

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

Related Questions