1

Я строю свое первое приложение с firebase-auth.Почему для firebase-auth требуется столько разрешений Google Play Services?

У меня есть Google Play Services 10.0.84 установлена ​​на моем устройстве HTC M8 уровня API апи 23.

Я изначально имеют права инвалидов на Google Play Services и я позволяю им в соответствии с просьбой.

Когда я добавляю зависимость firebase-аутентификации и попытаться создать пользователя я получаю

E/GoogleApiAvailability: Неожиданный код ошибки 19

и я получаю запрос на уведомление, чтобы разрешить Google Слушать Службы Доступ к Календарю, Камере, Контакты, Микрофону, Телефону, Датчикам тела, СМС и Хранению.

Я хотел бы знать, почему все эти разрешения запрашиваются.

Я прочитал сообщение CommonsWare https://commonsware.com/blog/2015/06/25/hey-where-did-these-permissions-come-from.html и, как он упоминает, я небольшой бренд и не хочу отпугивать потенциальных пользователей.

В моей простой тест активности я не пытаюсь явно компилировать любые Google-Play-сервисов или других firebase зависимости друг от

com.google.firebase: firebase-AUTH: 10.0. 1

и я понимаю, что все игровые сервисные базы, игровые сервисы-подвалы, firebase-analytics, firebase-common и firebase-iid добавлены.

Единственное разрешение я явно запросить это "android.permission.INTERNET", и я понимаю, из моего Merged Manifest, что также добавлены следующие:

  • android.permission.ACCESS_NETWORK_STATE
  • android.permission. WAKE_LOCK
  • com.google.android.c2dm.permission.RECEIVE

три из которых кажется достаточно справедливым.

Но firebase-auth нужны все эти другие разрешения от Служб Google Play? (SMS, ДАТЧИКИ ТЕЛА, МИКРОФОН и т. Д.). Если да, то почему? и если нет, почему Google Play Services просит их?

Моей зависимость:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:25.1.1' 
    compile "com.google.firebase:firebase-auth:10.0.1" 


    testCompile 'junit:junit:4.12' 
} 

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

Мой верхний файл сборка Уровня:

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.2.3' 
     classpath 'com.google.gms:google-services:3.0.0' 
     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

и моя простой тест активность ..

public class MainActivity extends AppCompatActivity { 

    private FirebaseAuth mAuth; 
    private FirebaseAuth.AuthStateListener mAuthListener; 
    private static final String TAG = MainActivity.class.getName(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mAuth = FirebaseAuth.getInstance(); 
     mAuth.createUserWithEmailAndPassword("[email protected]", "1234567") 
       .addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         Toast.makeText(MainActivity.this, "createUserWithEmail:onComplete:" + task.isSuccessful(), Toast.LENGTH_SHORT).show(); 

         // If sign in fails, display a message to the user. If sign in succeeds 
         // the auth state listener will be notified and logic to handle the 
         // signed in user can be handled in the listener. 
         if (!task.isSuccessful()) { 
          Toast.makeText(MainActivity.this, "Authentication failed." + task.getException(), 
            Toast.LENGTH_LONG).show(); 
         } else { 
          startActivity(new Intent(MainActivity.this, MainActivity.class)); 
          finish(); 
         } 
        } 
       }); 


     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if (user != null) { 
        // User is signed in 
        Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
       } else { 
        // User is signed out 
        Log.d(TAG, "onAuthStateChanged:signed_out"); 
       } 
       // ... 
      } 
     }; 
    } 
    @Override 
    public void onStart() { 
     super.onStart(); 
     mAuth.addAuthStateListener(mAuthListener); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     if (mAuthListener != null) { 
      mAuth.removeAuthStateListener(mAuthListener); 
     } 
    } 
} 
+0

Вы разрешили это? – noogui

+0

Да, у меня возникла проблема с запуском в эмуляторе, как вы предположили, из-за того, что мой dev env уже находится в виртуальной машине, но мой код работал в Genymotion без запроса разрешений. Затем я снова попытался на своем устройстве, и он также не запрашивал разрешения. Я не знаю, почему и что изменилось на моем устройстве, но теперь он работает, а firebase-auth не является причиной. Огромное спасибо. – Leinster

+0

Хорошо, что мы прояснили это. Отличная работа! – noogui

ответ

0

Я не думаем, firebase-аутентификация является виноват в этом.Если вы утверждение верно, что

com.google.firebase:firebase-auth:10.0.1 

является виновником, то я бы столкнулся с этим, когда я побежал Firebase Android codelab, который использует firebase-авторизации, но не сделал этого.

Using permissions - это способ Android защитить «конфиденциальность пользователя или обычную работу устройства». Если ваше приложение использует такие функции, как камера, микрофон и контакты, вам будет предложено написать эти разрешения. Разрешение запрашивается во время выполнения или при установке в зависимости от targetSdkVersion.

Основной Android приложение не имеет прав, связанных с ним по умолчанию, означает, что он не может ничего, что может негативно повлиять на пользовательский опыт или каких-либо данных на устройстве сделать. Чтобы использовать защищенные функции устройства, вы должны включить один или несколько тегов в манифест приложения.

Если ваше приложение перечисляет обычные разрешения в его манифесте (то есть разрешение, которые не представляют большой риск для личной жизни пользователя или функционирований устройства), система автоматически предоставляет эти разрешения. Если ваше приложение перечисляет опасные разрешения в своем манифесте (то есть разрешения, которые могут потенциально повлиять на конфиденциальность пользователя или обычную работу устройства), система запрашивает у пользователя явно предоставление этих разрешений.

Существует более подробное объяснение разрешений в Requesting Permissions guide, которые, как мы надеемся, проливают свет на то, почему они требуются.

+0

Спасибо за ответ и ссылки. Я просто создал приложение из кодека Firebase Android и запускал его без разрешения разрешений Google Play. Появится диалоговое окно, в котором говорится, что приложение не будет работать, если я не разрешу Google Play Services доступ к Календарю, Камере, контактам, микрофону, телефону, датчикам тела, SMS и Хранению. У вас были отключены эти права при первом запуске codelab? – Leinster

+0

Нет, это странно .. в дружественном чате приложение для firebase не спрашивает об этом, у меня оно есть на моем телефоне – noogui

+0

Итак, если вы перейдете в «Настройки»> «Службы»> «Службы Google Play»> «Разрешения», вы можете отключить все разрешения и успешно запустить «Friendly» Приложение чата? – Leinster