Android 为什么firebase auth需要这么多Google Play服务权限?
我正在使用firebase auth构建我的第一个应用程序 我的设备HTC M8 API level 23上安装了Google Play Services 10.0.84 我最初禁用了Google Play服务的权限,并根据请求允许它们 当我添加firebase身份验证依赖项并尝试创建用户时,我得到一个 E/GoogleAppAvailability:意外错误代码19 我收到一个通知请求,允许Google Play服务访问日历、摄像头、通讯录、麦克风、电话、身体传感器、短信和存储 我想知道为什么需要所有这些权限 我读过Commonware的帖子,正如他提到的,我是一个小品牌,不想吓跑潜在用户 在我的简单测试用例活动中,我没有尝试显式编译任何google play服务或其他firebase依赖项,除了 firebase:firebase auth:10.0.1 我知道游戏服务库、游戏服务库、firebase分析、firebase common和firebase iid都已添加 我明确请求的唯一权限是“android.permission.INTERNET”,我从合并清单中了解到,还添加了以下内容:Android 为什么firebase auth需要这么多Google Play服务权限?,android,firebase,google-play-services,firebase-authentication,Android,Firebase,Google Play Services,Firebase Authentication,我正在使用firebase auth构建我的第一个应用程序 我的设备HTC M8 API level 23上安装了Google Play Services 10.0.84 我最初禁用了Google Play服务的权限,并根据请求允许它们 当我添加firebase身份验证依赖项并尝试创建用户时,我得到一个 E/GoogleAppAvailability:意外错误代码19 我收到一个通知请求,允许Google Play服务访问日历、摄像头、通讯录、麦克风、电话、身体传感器、短信和存储 我想知道为什么
- android.permission.ACCESS\u网络\u状态
- android.permission.WAKE_锁
- com.google.android.c2dm.permission.RECEIVE
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("example@example.ie", "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);
}
}
}
public类MainActivity扩展了AppCompatActivity{
私人消防队;
私有FirebaseAuth.AuthStateListener mAuthListener;
私有静态最终字符串标记=MainActivity.class.getName();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAuth=FirebaseAuth.getInstance();
mAuth.createUserWithEmailAndPassword(“example@example.ie", "1234567")
.addOnCompleteListener(MainActivity.this,新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
Toast.makeText(MainActivity.this,“createUserWithEmail:onComplete:“+task.issusccessful(),Toast.LENGTH\u SHORT).show();
//如果登录失败,则向用户显示消息。如果登录成功
//将通知身份验证状态侦听器,并使用逻辑来处理
//可以在侦听器中处理已登录用户。
如果(!task.issusccessful()){
Toast.makeText(MainActivity.this,“身份验证失败”。+task.getException(),
Toast.LENGTH_LONG).show();
}否则{
startActivity(新意图(MainActivity.this、MainActivity.class));
完成();
}
}
});
mAuthListener=new FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
//用户已登录
Log.d(标记为“+user.getUid()”);
}否则{
//用户已注销
Log.d(标记“onAuthStateChanged:signed_out”);
}
// ...
}
};
}
@凌驾
public void onStart(){
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@凌驾
公共void onStop(){
super.onStop();
if(mAuthListener!=null){
removeAuthStateListener(mAuthListener);
}
}
}
我不认为firebase auth应该为此负责。如果你说的是真的
com.google.firebase:firebase-auth:10.0.1
是罪魁祸首那么我在运行使用firebase auth的时会遇到这种情况,但我没有
是安卓保护“用户隐私或设备正常运行”的方式。如果你的应用程序使用照相机、麦克风和通讯录等功能,你将被要求写入这些权限。根据targetSdkVersion的不同,在运行时或安装时会请求该权限
默认情况下,基本Android应用程序没有与其关联的权限,
这意味着它不能做任何会对用户产生不利影响的事情
设备上的经验或任何数据。利用受保护的
设备的功能,您必须包括一个或多个
应用程序清单中的标记
如果您的应用程序在其清单中列出了正常权限(即,
不会对用户隐私或安全造成太大风险的权限
设备的操作),系统会自动授予
权限。如果您的应用程序在其清单中列出了危险的权限
(即,可能影响用户隐私的权限
或设备的正常操作),系统要求用户
显式授予这些权限
中对权限进行了更深入的解释,希望能解释为什么需要这些权限。我不认为firebase auth应该对此负责。如果你说的是真的
com.google.firebase:firebase-auth:10.0.1
是罪魁祸首那么我在运行使用firebase auth的时会遇到这种情况,但我没有
是安卓保护“用户隐私或设备正常运行”的方式。如果你的应用程序使用照相机、麦克风和通讯录等功能,你会被问到