База данных Firebase не реализована из-за ошибки сеанса - PullRequest
0 голосов
/ 01 июля 2019

Я создаю чат-бота, который я интегрировал с Dialogflow и Firebase.Как я могу исправить проблему ошибки сеанса (показанную ниже) в Logcat Firebase?Это из-за проблемы в моей Android Studio или моего соединения с Firebase?У меня возникает проблема с надуванием моего представления рециркулятора, которое использует FirebaseRecyclerAdapter для его раздувания.

  1. Регистрация приложения Firebase для подключения к его серверу заняла много времени, поэтому я пропустил шагдумая, что я подключу его через файл google-json.

  2. Поскольку я использую базу данных Firebase UI v5.0.0, мне пришлось изменить метод FirebaseRecyclerAdapter в соответствии с недавним обновлением, приведенным здесь: https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md

Файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.internchatbot">
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="android:appComponentFactory"
        android:appComponentFactory="androidx">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>
        </activity>

    </application>

</manifest>

Зависимости app.gradle:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.google.firebase:firebase-database:18.0.0'
    // FirebaseUI for Firebase Realtime Database
    implementation 'com.firebaseui:firebase-ui-database:5.0.0'
    implementation 'com.google.firebase:firebase-messaging:19.0.1'
    //implementation 'com.firebaseui:firebase-ui-database:2.3.0'
    implementation 'ai.api:sdk:2.0.7@aar'
    //implementation

    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'commons-io:commons-io:2.4'
    implementation "ai.api:libai:1.6.12"
    implementation 'com.google.firebase:firebase-core:17.0.0'
    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'
    implementation 'com.android.support:recyclerview-v7:28.0.0-rc02'
}
apply plugin: 'com.google.gms.google-services'

MainActivity.java:

public class MainActivity extends AppCompatActivity implements AIListener{  //because I am recording audio too

    RecyclerView recyclerView;
    EditText editText;
    RelativeLayout addBtn;
    private DatabaseReference ref;            //declaration of variables
    Boolean flagFab = true;



final   AIConfiguration config = new AIConfiguration("0c01e159babc4349b38eca698bd2f107",
            AIConfiguration.SupportedLanguages.English,
            AIConfiguration.RecognitionEngine.System); 

    private AIService aiService;
    final AIDataService aiDataService = new AIDataService(config);
    final AIRequest aiRequest = new AIRequest();

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

        ActivityCompat.requestPermissions(this, new String[]  {Manifest.permission.RECORD_AUDIO},1);//permission from manifest file


        recyclerView = findViewById(R.id.recyclerView);
        editText = findViewById(R.id.editText);
        addBtn = findViewById(R.id.addBtn);
        recyclerView.setHasFixedSize(true);

        final LinearLayoutManager linearLayoutManager = new  LinearLayoutManager(this);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);

         Query query = FirebaseDatabase.getInstance().getReference().child("chats").limitToLast(50);//upto 50 characters to be displayed

        ref.keepSynced(true);//i don't know its purpose. Please explain :')

        aiService = AIService.getService(this, config);
        aiService.setListener(this);

        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String message = editText.getText().toString().trim();

                if (!message.equals("")) {

                    ChatMessage chatMessage = new ChatMessage(message, "user");
                    ref.child("chat").push().setValue(chatMessage);


                    aiRequest.setQuery(message);
  //MyAsyncTask is a subclass of MainActivity extending ASyncTask
                    MyAsyncTask myasynctask = new MyAsyncTask();
                    myasynctask.execute();    
                    }
                else {
                    aiService.startListening();
                }

                editText.setText("");

            }
        });

//Below code changes the image ie when audio is recorded it is mic else //arrow for sending message

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                ImageView fab_img = findViewById(R.id.fab_img);
                Bitmap img = BitmapFactory.decodeResource(getResources(),R.drawable.ic_send_white_24dp);
                Bitmap img1 = BitmapFactory.decodeResource(getResources(),R.drawable.ic_mic_white_24dp);


                if (s.toString().trim().length()!=0 && flagFab){
                    ImageViewAnimatedChange(MainActivity.this,fab_img,img);

                    flagFab=false;

                }
                else if (s.toString().trim().length()==0){
                    ImageViewAnimatedChange(MainActivity.this,fab_img,img1);
                    flagFab=true;

                }
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

//FirebaseRecyclerOption below because firebase+recycler view

        FirebaseRecyclerOptions<ChatMessage>options=new FirebaseRecyclerOptions.Builder<ChatMessage>().setQuery(query,ChatMessage.class).build();
        //Chatmessage,chat_rec//<image_details,blogviewholder>=<same>()<image_details.class,r.lao

        final FirebaseRecyclerAdapter<ChatMessage, chat_rec> adapter = new FirebaseRecyclerAdapter<ChatMessage, chat_rec>(options) {

        @NonNull
        @Override
        public chat_rec onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.msglist,parent,false);//R.layout.msglist is the default layout for chats

                return new chat_rec(view);
        }

        @Override
        protected void onBindViewHolder(chat_rec holder, int position, ChatMessage model) {
                // Bind the Chat object to the ChatHolder
                // ...

                if (model.getMsgUser().equals("user")) {


                    holder.rightText.setText(model.getMsgText());

                    holder.rightText.setVisibility(View.VISIBLE);
                    holder.leftText.setVisibility(View.GONE);
                }
                else {
                    holder.leftText.setText(model.getMsgText());

                    holder.rightText.setVisibility(View.GONE);
                    holder.leftText.setVisibility(View.VISIBLE);
                }

            }

        };

        adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
                super.onItemRangeInserted(positionStart, itemCount);

                int msgCount = adapter.getItemCount();
                int lastVisiblePosition = linearLayoutManager.findLastCompletelyVisibleItemPosition();

                if (lastVisiblePosition == -1 ||
                        (positionStart >= (msgCount - 1) &&
                                lastVisiblePosition == (positionStart - 1))) {
                    recyclerView.scrollToPosition(positionStart);

                }

            }
        });
        recyclerView.setAdapter(adapter);
    }//onCreate ends here


//Ayncronous Task defined here:

        private class MyAsyncTask extends AsyncTask<AIRequest,Void,AIResponse>{


        @Override
        protected AIResponse doInBackground(AIRequest... aiRequests) {
            final AIRequest request = aiRequests[0];
            try {
                final AIResponse response =         aiDataService.request(aiRequest);
                return response;
            } catch (AIServiceException e) {
            }
            return null;
        }
        @Override
        protected void onPostExecute(AIResponse response) {
            //super.onPostExecute(response);

            if (response != null) {

                Result result = response.getResult();
                String reply = result.getFulfillment().getSpeech();
                ChatMessage chatMessage = new ChatMessage(reply, "KG Precision Moulders");
                ref.child("Tech Support").push().setValue(chatMessage);
            }
        }
    }

/*While recording audio there should be mic image in button and when typing message there should be arrow*/
    public void ImageViewAnimatedChange(Context c, final ImageView v, final Bitmap new_image) {
        final Animation anim_out = AnimationUtils.loadAnimation(c, R.anim.zoom_out);
        final Animation anim_in  = AnimationUtils.loadAnimation(c, R.anim.zoom_in);
        anim_out.setAnimationListener(new Animation.AnimationListener()
        {
            @Override public void onAnimationStart(Animation animation) {}
            @Override public void onAnimationRepeat(Animation animation) {}
            @Override public void onAnimationEnd(Animation animation)
            {
                v.setImageBitmap(new_image);
                anim_in.setAnimationListener(new Animation.AnimationListener() {
                    @Override public void onAnimationStart(Animation animation) {}
                    @Override public void onAnimationRepeat(Animation animation) {}
                    @Override public void onAnimationEnd(Animation animation) {}
                });
                v.startAnimation(anim_in);
            }
        });
        v.startAnimation(anim_out);
    }
        @Override
        public void onResult(ai.api.model.AIResponse response) {
            Result result = response.getResult();
            String message = result.getResolvedQuery();
            ChatMessage chatMessage0 = new ChatMessage(message, "user");
            ref.child("chat").push().setValue(chatMessage0);
            String reply = result.getFulfillment().getSpeech();
            ChatMessage chatMessage = new ChatMessage(reply, "bot");
            ref.child("chat").push().setValue(chatMessage);
    }

В коде нет ошибок, но logcat, когда я выбираю firebase, показывает эти ошибки:

E/SystemUpdate-Connection: create session error : RESULT_ERROR

E/MiPicks-Connection: create session error : RESULT_ERROR

E/MiPicks-ConnectionRSA: get key exception : com.android.org.bouncycastle.util.encoders.DecoderException: unable to decode base64 string: invalid characters encountered in base64 data

И я тоже получаю RecyclerViewException.Вероятно, ошибки связаны с тем, что RecyclerView не раздувается:

Process: com.example.internchatbot, PID: 6443
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.internchatbot/com.example.internchatbot.MainActivity}: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class android.support.v7.widget.RecyclerView
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2747)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2808)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1541)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:165)
        at android.app.ActivityThread.main(ActivityThread.java:6375)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
     Caused by: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class android.support.v7.widget.RecyclerView
     Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class android.support.v7.widget.RecyclerView
     Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.widget.RecyclerView" on path: DexPathList[[zip file "/data/app/com.example.internchatbot-1/base.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_slice_7_apk.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.example.internchatbot-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.example.internchatbot-1/lib/arm64, /system/lib64, /vendor/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:74)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.view.LayoutInflater.createView(LayoutInflater.java:613)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:812)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:752)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:883)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:846)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:522)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:430)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:469)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)
        at com.example.internchatbot.MainActivity.onCreate(MainActivity.java:68)
        at android.app.Activity.performCreate(Activity.java:6845)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2700)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2808)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1541)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:165)
        at android.app.ActivityThread.main(ActivityThread.java:6375)
2019-07-02 00:47:44.291 6443-6443/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)

Я мог бы сделать до здесь.Помоги мне, ребята!Я смертельно устал!

Ответы [ 3 ]

0 голосов
/ 02 июля 2019

Похоже, что ваша ошибка пожарной базы происходит из-за представления переработчика. Это означает, что приложение упало до того, как firebase может начать сеанс.

Поэтому я предлагаю вам сначала исправить ошибку инфляции. Для этого, пожалуйста, проверьте, существует ли ниже библиотека в файле уровня приложения build.gradle.

implementation 'com.android.support:recyclerview-v7:28.0.0'
0 голосов
/ 02 июля 2019

Здесь, в этом случае, поскольку я мигрировал с android на androidx, мне пришлось изменить определение layout / activity_main.xml предыдущего RecyclerView, то есть с android.support.v7.widget.RecyclerView на androidx.recyclerview.widget.RecyclerView, как указал мне г-н Йоси.

Следовательно, мой обновленный файл activity_main.xml:

    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.internchatbot.MainActivity"
     >
    <androidx.recyclerview.widget.RecyclerView  <!--change made here-->
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="10dp"
        android:paddingBottom="50dp"
        android:clipToPadding="false"
        android:background="#f4f6f7"
        />
     ...
     ...
</RelativeLayout>

0 голосов
/ 02 июля 2019

Регистрация приложения Firebase для подключения к его серверу заняла много времени, поэтому я пропустил шаг, подумав, что я подключу его через файл google-json.

Важнозарегистрируйте свое приложение в консоли Firebase, а затем убедитесь, что в вашем проекте есть файл google-services.json.Он содержит ключ API и некоторые настройки.Отсутствие этого может привести к ошибкам, таким как то, с чем вы сейчас имеете дело.

...