我使用Firebase Analytics,我的应用程序使用以下代码记录一些事件:
Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.ITEM_ID, "SOME_ID")
bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "SOME_TYPE");
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);
Run Code Online (Sandbox Code Playgroud)
它似乎在大多数时候都很好用.在logcat我有这样的事情:
Logging event (FE): select_content, Bundle[{_o=app, content_type=SOME_TYPE, item_id=SOME_ID}]
Run Code Online (Sandbox Code Playgroud)
但对于我收到的一些事件
Logging event (FE): select_content, Bundle[{_o=app, _ev=item_id, _err=4, content_type=SOME_TYPE}]
Run Code Online (Sandbox Code Playgroud)
显然,_err = 4是某种错误代码.这是什么意思?
在那种有错误的情况下,我item_id是一个很长的字符串(20-30个符号).也许这个长度有限制item_id?
我用了
//Analytics
compile 'com.google.firebase:firebase-core:9.2.1'
// Crash
compile 'com.google.firebase:firebase-crash:9.2.1'
Run Code Online (Sandbox Code Playgroud)
并在我生成的清单中获得了这些人:
<!-- Required permission for App measurement to run. -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Optional permission for App measurement to run. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
Run Code Online (Sandbox Code Playgroud)
然后我们有以下块
<permission
android:name="my.package.name.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="my.package.name.permission.C2D_MESSAGE" />
Run Code Online (Sandbox Code Playgroud)
我的问题:
如果我只使用 Firebase Analytics 和 Crash 并且不需要任何消息传递功能,是否可以删除第二个块,如下所示:
<uses-permission android:name="my.package.name.permission.C2D_MESSAGE" tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)
第一个块中的“应用程序测量运行的可选权限”是什么意思?删除它也安全吗?
android firebase firebase-analytics firebase-crash-reporting
我正在使用以下代码在我的应用程序中设置特定语言.语言保存SharedPreferences在应用程序中.它完全可以达到API级别23.由于Android N也SharedPreferences运行良好,它返回正确的语言代码字符串,但它不会更改区域设置(设置手机的默认语言).可能有什么不对?
更新1:当我Log.v("MyLog", config.locale.toString());在res.updateConfiguration(config, dm)它返回正确的语言环境后立即使用,但应用程序的语言没有改变.
更新2:我还提到如果我更改区域设置然后重新启动活动(使用新意图并完成旧版本),它会正确更改语言,甚至在轮换后显示正确的语言.但是当我关闭应用程序并再次打开它时,我会得到默认语言.有点奇怪.
public class ActivityMain extends AppCompatActivity {
//...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set locale
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
String lang = pref.getString(ActivityMain.LANGUAGE_SAVED, "no_language");
if (!lang.equals("no_language")) {
Resources res = context.getResources();
Locale locale = new Locale(lang);
Locale.setDefault(locale);
DisplayMetrics dm = res.getDisplayMetrics();
Configuration config = res.getConfiguration();
if (Build.VERSION.SDK_INT >= 17) {
config.setLocale(locale);
} else {
config.locale = locale;
}
}
res.updateConfiguration(config, …Run Code Online (Sandbox Code Playgroud) 我的清单文件android:minimalSize里面有一个问题activity - layout.它说
在'android'包中找不到属性'minimalSize'的资源标识符
真奇怪.从这里开始https://developer.android.com/preview/features/multi-window.html#configuration它似乎android:minimalSize是多窗口模式的合法属性.
此外,其他属性里面activity - layout喜欢android:defaultHeight和android:defaultWidth正常.
也许有人有类似的问题.
应用级别build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.0"
defaultConfig {
//...
minSdkVersion 16
targetSdkVersion 24
//...
}
//...
}
dependencies {
//...
compile 'com.android.support:appcompat-v7:24.0.0'
}
Run Code Online (Sandbox Code Playgroud)
AndroidManifest.xml:
//...
<activity
//...
android:resizeableActivity="true">
<layout android:minimalSize="450dp" />
//...
</activity>
//...
Run Code Online (Sandbox Code Playgroud) 在Python我们可以将属性添加到一个对象(类)动态地,例如:
class Foo(object):
pass
foo = Foo()
foo.a = 10
Run Code Online (Sandbox Code Playgroud)
我的问题可能有点理论上的问题.所以,它很方便.但是我们为什么要使用这个功能??? 当这种方法更可取时,有什么特别的情况吗?封装怎么样?