为什么firebase-auth需要这么多Google Play服务权限?

时间:2017-02-08 18:56:07

标签: android firebase google-play-services firebase-authentication

我正在使用firebase-auth构建我的第一个应用程序。

我的设备HTC M8 API api级别23上安装了Google Play Services 10.0.84。

我最初为Google Play服务禁用了权限,并按要求允许这些权限。

当我添加firebase-auth依赖项并尝试创建用户时,我得到了

  

E / GoogleApiAvailability:意外的错误代码19

我收到通知请求,允许Google Play服务访问日历,相机,通讯录,麦克风,电话,身体传感器,短信和存储空间。

我想知道为什么要求所有这些权限。

我已经阅读了CommonsWare的帖子https://commonsware.com/blog/2015/06/25/hey-where-did-these-permissions-come-from.html,正如他所提到的,我是一个小品牌,并且不想吓跑潜在用户。

在我的简单测试用例活动中,我并没有尝试显式编译任何google-play-services或其他firebase依赖项

  

com.google.firebase:火力-AUTH:10.0.1

我知道游戏服务基础,游戏服务基础,firebase-analytics,firebase-common和firebase-iid都已添加。

我明确要求的唯一权限是" android.permission.INTERNET"我从合并清单中了解到,还添加了以下内容:

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

其中三个似乎足够公平。

firebase-auth 是否需要Google Play服务的所有其他权限? (SMS,BODY SENSORS,MICROPHONE等)如果是这样,为什么?如果没有,为什么Google Play服务会要求他们?

我的依赖项:

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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我不认为firebase-auth应该归咎于此。如果你的陈述是真的

com.google.firebase:firebase-auth:10.0.1

是罪魁祸首然后当我运行使用firebase-auth的Firebase Android codelab时我会遇到这个,但我没有。

Using permissions是Android保护用户隐私或设备正常运行的方式&#34;。如果您的应用使用“相机”,“麦克风”和“通讯录”等功能,系统会要求您编写这些权限。根据targetSdkVersion,在运行时或安装时询问权限。

  

默认情况下,基本Android应用没有与之关联的权限,   意味着它不能做任何会对用户产生负面影响的事情   经验或设备上的任何数据。利用受保护的   设备的功能,您必须包括一个或多个   应用清单中的标签。

     

如果您的应用在其清单中列出了正常权限(即,   权限不会对用户的隐私或隐私造成太大风险   设备的操作),系统自动授予那些   权限。如果您的应用在其清单中列出了危险权限   (即可能会影响用户隐私的权限   或者设备的正常操作),系统要求用户   明确授予这些权限。

Requesting Permissions guide中对权限有更深入的解释,希望能够阐明为什么需要它们。