在我的android应用程序中,我有一个活动,它有3或4个片段,可以根据一些用户或服务器事件按顺序附加。
我想在firebase中将所有这些片段作为屏幕进行跟踪。
因此,理想情况下,如果可能的话,是否有一个API我可以在片段的onCreate中调用,并告诉firebase用户当前处于fraction1,fragment2或fracment3中?
在这里为Artem Mostyaev的答案添加了更多的见解。GA/Firebase面板在开发版本中反映了类名,但在产品版本中没有。这里的罪魁祸首是
fragment.getClass().getSimpleName()
它混淆了prod中的片段名。所以GA/Firebase显示类名类似于(a,b,ah等)
getSimpleName()在其他情况下使用也很危险。
更多文献:https://medium.com/@elye.project/the-danger-of-using-class-getsimplename-as-tag-for-fragment-5cdf3a35bfe2
Progaurd规则
-keepnames class com.somepackage.yourclass
由于<code>setCurrentScreen。
这里有一篇博客文章解释了更多关于手动跟踪屏幕的信息。
这里有一个例子:
private fun setCurrentScreen(screenName: String) = firebaseAnalytics?.run {
val bundle = Bundle()
bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, screenName)
bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, this@BaseFragment.javaClass.simpleName)
logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)
}
此外,如果您想自动跟踪屏幕,您可以在BaseFraank
生命周期方法之一中调用此函数,例如onResume
。请记住,某些片段可能不必更改当前屏幕,例如在ViewPager
中创建的片段,因此我声明了一个open val
,您可以覆盖
以更改默认行为。
这是BaseFragment
中的代码:
protected open val trackScreenView: Boolean = true
override fun onResume() {
super.onResume()
if (trackScreenView) setCurrentScreen(this.javaClass.simpleName)
}
您可以通过在目标Fraance
中覆盖它来禁用它:
override val trackScreenView: Boolean = false
顺便说一句,如果您使用的是NavigationUI
Component,目前没有跟踪屏幕的自动解决方案,它只跟踪您拥有的单个活动,因此您可以通过将此元数据
放在您的应用程序清单中来防止Firebase自动屏幕报告:
<application
android:name=".App"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<!-- .... -->
<meta-data
android:name="google_analytics_automatic_screen_reporting_enabled"
android:value="false" />
</application>
更新
由于<code>setCurrentScreen
Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, fragment.getClass().getSimpleName());
bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, fragment.getClass().getSimpleName());
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle);
我使用了以下adb命令来检查是否一切正常。
adb shell setprop log.tag.FA VERBOSE
adb shell setprop log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC
完成此操作后,您将在logcat中看到<code>screen_view
10-15 13:14:13.744V/FA-SVC(20323):日志事件:origin=app,name=screen_view(_vs),params = Bundle[{ ga _ event _ origin(_ o)= app,engagement _ time _ msec(_ et)= 31600,ga _ previous _ class(_ PC)= contents fragment,ga _ previous _ id(_ pi)= 80774743614722
上一个答案
设置当前屏幕有一个特殊的方法- setCurrentScreen
我用它如下
mFirebaseAnalytics.setCurrentScreen(this, fragment.getClass().getSimpleName(), fragment.getClass().getSimpleName());
一旦调用了该方法,LogCat中就会出现以下消息
日志记录事件(FE):screen_view(_vs),Bundle[{firebase_event_origin(_o)=auto,firebase_previous_class(_pc)=HomeFragment,firebase_previous_id(_pi)=4121566113087629222,firebase_previous_screen(_pn)=HomeFragment,firebase_screen_class(_sc)=StatisticsFragment,firebase_screen_id(_si)=4121566113087629223,firebase_screen(_sn)=StatisticsFragment}]
以下事件出现在自动活动跟踪中:
日志记录事件 (FE): screen_view(_vs), Bundle[{firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=StatisticsFragment, firebase_previous_id(_pi)=4121566113087629223, firebase_previous_screen(_pn)=StatisticsFragment, firebase_screen_class(_sc)=LoginActivity, firebase_screen_id(_si)=4121566113087629224}]
如您所见,它们几乎相同,因此< code>setCurrentScreen正在工作。
我只能在第二天在Firebase控制台中看到这些类。这对Firebase来说很正常——处理如此大量的数据需要时间。
问题内容: 如果对http请求的响应是带有cookie的重定向(http代码302), 您如何指示Go客户使用收到的Cookie跟踪新位置? 在CURL中,可以通过以下方式轻松设置客户端: 您如何在Go中做到这一点? 问题答案: 使用Go 1.1,您可以使用。 这是一个工作示例:
问题内容: 我曾经短暂地附加一个过程。该过程创建了90个线程。当我找到有问题的线程时,我必须繁琐地搜索父线程,然后是祖父母线程,一直到根进程。 是否有技巧或工具可以快速找出哪个线程创建了另一个线程?还是更好,打印类似树的线程创建树? 问题答案: 跟踪编辑的子进程。
我需要设置许多每周重复的警报,当用户在上课时(这是一个学术应用程序)自动将手机调到振动状态,然后在下课时重置音量。 用户可以取消课程和注册课程(但不能直接在应用程序中),这将更新并反映在数据库中,只保留当前的课程。因此,如果我有一个警报设置到一个不再存在的类,我如何取消它,如果我不能复制PendingIntent? 我在这里看到的一个解决方案是创建一个数据库表来跟踪当前的警报,然后我就可以完全控制
问题内容: 我可以使用Python中的OpenCV从网络摄像头获取帧。camshift示例接近我想要的,但是我不希望人工干预来定义对象。我想获得在几帧的过程中变化的总像素的中心点,即运动对象的中心。 问题答案: 我已经从博客文章 使用OpenCV进行运动检测中 找到的C版本的代码转换了一些工作代码:
问题内容: 我有一台固定的摄像机,指向室内区域。人们将走过相机,距离相机约5米。使用 OpenCV ,我想检测走过的人- 我的理想回报是一组检测到的具有矩形边界的人。 我看了几个内置示例: 没有一个 Python 示例真正适用 该 ç 斑点跟踪样品看起来很有希望,但不接受现场视频,这使得检测困难。它也是最复杂的示例,使得提取相关知识并将其转换为有问题的Python API。 该 ç “motemp
问题内容: 在程序快要结束时,我希望将类的所有实例中的特定变量加载到字典中。 例如: 假设实例数量会有所不同,我希望将Foo()的每个实例的x dict加载到新的dict中。我该怎么办? 我在SO中看到的示例假定一个已经具有实例列表。 问题答案: 跟踪实例的一种方法是使用类变量: 在程序结束时,您可以像下面这样创建字典: 只有一个列表: