我想在没有 google-services.json 的情况下使用 FirebaseOptions 初始化 Firebase,我正在关注此处的博客文章 https://firebase.googleblog.com/2017/03/take-control-of-your-firebase-init- on.html。
我删除了 FirebaseInitProvider。
<provider
android:name="com.google.firebase.provider.FirebaseInitProvider"
android:authorities="${applicationId}.firebaseinitprovider"
tools:node="remove"/>
我正在尝试在应用程序子类中设置默认的 FirebaseApp:
FirebaseOptions options = new FirebaseOptions.Builder()
.setApplicationId("valid_app_id")
.setGcmSenderId("valid_gcm_sender_id")
.setApiKey("valid_api_key")
.build();
FirebaseApp.initializeApp(getApplicationContext(), options);
看起来一切正常,但是当我想将一些事件记录到 FirebaseAnalytics 时,我收到此错误:缺少 google_app_id。 Firebase 分析已禁用。 我不知道问题是什么。
不幸的是,Firebase Analytics 要求 xml 中包含
google_app_id
。但您可以通过创建上下文包装器并以编程方式提供密钥来避免这种情况。
示例:
public class App extends Application {
private ResourcesWrapper firebaseResources;
@Override
public Resources getResources() {
if (firebaseResources == null)
firebaseResources = new ResourcesWrapper(super.getResources());
return firebaseResources;
}
}
public class ResourcesWrapper extends Resources {
private final int R_STRING_GOOGLE_APP_ID = 1_999_999_999;
private final Resources wrapped;
public FirebaseResourcesWrapper (Resources wrapped) {
super(wrapped.getAssets(), wrapped.getDisplayMetrics(), wrapped.getConfiguration());
this.wrapped = wrapped;
}
@Override
public int getIdentifier(String name, String defType, String defPackage) {
if ("google_app_id".equals(name) && "string".equals(defType)) return R_STRING_GOOGLE_APP_ID;
return wrapped.getIdentifier(name, defType, defPackage);
}
@Override
public String getString(int id) throws NotFoundException {
if (id == R_STRING_GOOGLE_APP_ID) return getGoogleAppid();
return wrapped.getString(id);
}
// Provide your key programmatically
public String getGoogleAppid() {
return FirebaseApp.getInstance().getOptions().getApplicationId();
}
...
}
如果您不使用 google-services.json 文件,则 JSON 中存在的信息需要位于某个位置,以便插件/代码能够读取。您在这里可以做的是使用具有以下属性的字符串资源手动创建 xml 文件:
google_app_id:
{YOUR_CLIENT}/client_info/mobilesdk_app_id
gcm_defaultSenderId:
project_info/project_number
default_web_client_id:
{YOUR_CLIENT}/oauth_client/client_id (client_type == 3)
ga_trackingId:
{YOUR_CLIENT}/services/analytics-service/analytics_property/tracking_id
firebase_database_url:
project_info/firebase_url
google_api_key:
{YOUR_CLIENT}/api_key/current_key
google_crash_reporting_api_key:
{YOUR_CLIENT}/api_key/current_key
看看这里。确保添加 google_app_id,没有它会导致出现相关错误。
如果您没有将“tools”命名空间添加到清单根标记中,则还必须添加它:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="your.package"
>
其余的实现与使用
FirebaseOptions
和 Firebase.InitializeApp().
相同