He hecho una pregunta antes de dónde funcionaba mi aplicación solo en el emulador pero no en un dispositivo real, aquí hay un enlace:

La base de datos de Firebase no se actualiza sin errores, respuesta lenta

Desafortunadamente, no pude resolver el problema o resolverlo. Entonces, comencé desde cero y construí una aplicación simple que escribe "PRUEBA" en una base de datos en tiempo real, y el mismo problema estaba allí, la aplicación funciona SOLO en el emulador pero no en mi dispositivo real. Entonces, descubrí que la aplicación no puede conectarse a Firebase cuando la ejecuté en mi dispositivo. Pero no pude entender por qué?

Aquí está mi actividad principal:

package com.example.alice.testingfirebase;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;


public class MainActivity extends AppCompatActivity {


    private DatabaseReference mDatabase;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDatabase = FirebaseDatabase.getInstance().getReference();
        for (int i = 0; i<10;i++) {
            String id = i+"";
            mDatabase.child("users").child(id).setValue("TEST");
        }
    }
}

Aquí está mi manifiesto:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.alice.testingfirebase">

    <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">
        <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>

Y aquí está mi build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.alice.testingfirebase"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

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-core:16.0.1'
    implementation 'com.google.firebase:firebase-database:16.0.1'
    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'

}
apply plugin: 'com.google.gms.google-services'

Las reglas de la base de datos están configuradas para ser públicas.

Después de agregar el permiso de INTERNET, la aplicación sigue deteniéndose, y aquí hay parte del log cat:

09-09 14:39:55.374 21502-21537/com.example.alice.testingfirebase V/FA: Connection attempt already in progress
09-09 14:39:55.455 21502-21502/com.example.alice.testingfirebase D/AndroidRuntime: Shutting down VM
09-09 14:39:55.456 21502-21502/com.example.alice.testingfirebase E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.alice.testingfirebase, PID: 21502
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.alice.testingfirebase/com.example.alice.testingfirebase.MainActivity}: com.google.firebase.database.DatabaseException: Calls to setLogLevel() must be made before any other usage of FirebaseDatabase instance.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2955)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6938)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
     Caused by: com.google.firebase.database.DatabaseException: Calls to setLogLevel() must be made before any other usage of FirebaseDatabase instance.
        at com.google.firebase.database.FirebaseDatabase.zzb(Unknown Source:38)
        at com.google.firebase.database.FirebaseDatabase.setLogLevel(Unknown Source:3)
        at com.example.alice.testingfirebase.MainActivity.onCreate(MainActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:7183)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2908)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6938) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 
09-09 14:39:55.472 21502-21551/com.example.alice.testingfirebase W/zygote64: Skipping duplicate class check due to unrecognized classloader
09-09 14:39:55.474 21502-21551/com.example.alice.testingfirebase I/DynamiteModule: Considering local module com.google.android.gms.firebase_database:4 and remote module com.google.android.gms.firebase_database:6
09-09 14:39:55.475 21502-21551/com.example.alice.testingfirebase I/DynamiteModule: Selected remote version of com.google.android.gms.firebase_database, version >= 6
09-09 14:39:55.506 21502-21551/com.example.alice.testingfirebase W/zygote64: Skipping duplicate class check due to unrecognized classloader
09-09 14:39:55.567 21502-21559/com.example.alice.testingfirebase D/NetworkSecurityConfig: No Network Security Config specified, using platform default
09-09 14:39:55.573 21502-21559/com.example.alice.testingfirebase D/TcpOptimizer: TcpOptimizer-ON
09-09 14:40:00.281 21502-21521/com.example.alice.testingfirebase I/zygote64: WaitForGcToComplete blocked for 22.520ms for cause HeapTrim
09-09 14:40:00.286 21502-21521/com.example.alice.testingfirebase W/zygote64: Suspending all threads took: 5.439ms
1
Alice J 9 sep. 2018 a las 14:17

3 respuestas

La mejor respuesta

Agregue esto a su archivo de manifiesto.

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.alice.testingfirebase">
        <uses-permission android:name="android.permission.INTERNET"/>
        <application
            android:allowBackup="true"..
            ....
        </application>
</manifest>

También edite sus MainActivity me gusta

FirebaseDatabase obj= FirebaseDatabase.getInstance();
DatabaseReference mDatabase= obj.getReference();
for (int i = 0; i<10;i++) 
      {
         String id = i+"";
         mDatabase.child("users").child(id).setValue("TEST");
      }
1
Sushant Somani 9 sep. 2018 a las 11:50

Primero, no tiene permiso de Internet en su AndroidManifext.xml y todavía me pregunto cómo funciona en el emulador.

Segundo, inicialice FirebaseDatabase y luego DatabaseReference para poder leer y escribir datos en la base de datos de Firebase Realtime:

// Write a message to the database
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference().child("users").child("id"); //location to put, can be anything you want ...

myRef.setValue("TEST");

Además, ¿estás seguro de que esto es lo que quieres? ¿Poner cadena en un campo de identificación? ¡Considere revisar su base de datos FireBase en la consola!

Leer: https://firebase.google.com/docs / database / android / start

1
ʍѳђઽ૯ท 9 sep. 2018 a las 14:33

Para los desarrolladores que usan teléfonos VIVO y OPPO, estas marcas tienen un problema extraño al conectarse a Firebase. Tengo 7 dispositivos de diferentes marcas y configuraciones para fines de prueba y todos se conectan, excepto estos dos. No hay errores ni excepciones. Simplemente se niegan a conectarse. Solo quería plantear este punto para que los desarrolladores que usan estos teléfonos conozcan el problema.

2
Ram Iyer 4 abr. 2019 a las 15:37