Waychel

发现一个新世界


  • 首页

  • 关于

  • 归档

Firebase DebugView

发表于 2019-04-26
Android

To enable Analytics Debug mode on an emulated Android device, execute the following command line:

adb shell setprop debug.firebase.analytics.app <package_name>

This behavior persists until you explicitly disable Debug mode by executing the following command line:

adb shell setprop debug.firebase.analytics.app .none.

iOS

To enable Analytics Debug mode on your development device, specify the following command line argument in Xcode :

-FIRDebugEnabled

This behavior persists until you explicitly disable Debug mode by specifying the following command line argument:

-FIRDebugDisabled

Link

alpine docker exec "/bin/bash" stat /bin/bash no such file or directory 解决方案

发表于 2019-04-16

进入容器时报错:
docker exec -it containerId /bin/bash/

stat /bin/bash: no such file or directory

解决方法:
原因是alpine没有/bin/bash/,改成
docker exec -it containerId sh即可

Lint found fatal errors while assembling a release target.

发表于 2019-04-16
调试的时候,都没有问题,但是在打包的时候,报出下面的错误
1
2
3
4
5
6
7
8
9
10
11
Lint found fatal errors while assembling a release target.  
To proceed, either fix the issues identified by lint, or modify your build script as follows:
...
android {
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
}

解决方法:
这个错误报告会生成在
[app module]/build/reports/lint-results-yourBuildName-fatal.html
打开这个网页,可以看到详细的错误信息,修改起来就简单了。

GooglePlay谷歌商店安装来源追踪INSTALL_REFERRER

发表于 2019-03-29
理解

1.用户通过手机浏览器点击带有referrer的Url(如https://play.google.com/store/apps/details?id=com.xxx.xxx&referrer=test) (正常此网页下方在Play商店打开)
2.Google Play会记录附带的参数,(Finsky: [1] ifa.run(26): Capture referrer for com.xxx.xxx)
3.待用户下载安装之后,用户首次安装打开App时,Google Play将参数广播到App(Finsky: [1] ifb.run(12): Delivered referrer for com.xxx.xxx)。

代码实现(方式一,据说是Play Store 8.几之前才支持,未进行验证)

新建个类并继承BroadcastReceiver,用于接收referrer

1
2
3
4
5
6
7
8
9
10
11
public class InstallReferrerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String referrer = intent.getStringExtra("referrer");

Logger.e("install referrer:" + referrer);
if (referrer != null && referrer.length() > 0) {

}
}
}

AndroidManifest.xml

1
2
3
4
5
6
7
8
<receiver
android:name=".InstallReferrerReceiver"
android:exported="true"
android:permission="android.permission.INSTALL_PACKAGES" >
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>

代码实现(方式二)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class InstallReferrerUtil {

private final static String INSTALL_REFERRER = "com.android.vending.INSTALL_REFERRER";

public static void setup(Context context) {
InstallReferrerClient client = InstallReferrerClient.newBuilder(context)
.build();
client.startConnection(new InstallReferrerStateListener() {
@Override
public void onInstallReferrerSetupFinished(int responseCode) {
if (responseCode == InstallReferrerClient.InstallReferrerResponse.OK) {
try {
ReferrerDetails details = client.getInstallReferrer();
String referrer = details.getInstallReferrer();
if (!TextUtils.isEmpty(referrer)) {
SharedPrefUtils.getInstance().putJReferrer(referrer);
Intent referrerReceived = new Intent(INSTALL_REFERRER);
referrerReceived.putExtra("referrer", referrer);
//向App本身其他Receiver广播
Iterator var8 = context.getPackageManager().queryBroadcastReceivers(new Intent(INSTALL_REFERRER), 0).iterator();
while (var8.hasNext()) {
ResolveInfo var4 = (ResolveInfo) var8.next();
String var5 = referrerReceived.getAction();
if (var4.activityInfo.packageName.equals(context.getPackageName()) && INSTALL_REFERRER.equals(var5) && !this.getClass().getName().equals(var4.activityInfo.name)) {
BuglyLog.e("onReceive:class:", (new StringBuilder("trigger onReceive: class: ")).append(var4.activityInfo.name).toString() + "");
try {
((BroadcastReceiver) Class.forName(var4.activityInfo.name).newInstance()).onReceive(context, referrerReceived);
} catch (Throwable var6) {
BuglyLog.e("onReceive:class:", (new StringBuilder("error in BroadcastReceiver ")).append(var4.activityInfo.name).toString(), var6);
}
}
}
}
AndroidSchedulers.mainThread().createWorker().schedule(() -> CrashReport.postCatchedException(new Throwable("referral:" + referrer)));
} catch (RemoteException e) {
// omit exception
AndroidSchedulers.mainThread().createWorker().schedule(() -> CrashReport.postCatchedException(new Throwable("RemoteException:" + e.getMessage())));
}
}
}
@Override
public void onInstallReferrerServiceDisconnected() {
AndroidSchedulers.mainThread().createWorker().schedule(() -> CrashReport.postCatchedException(new Throwable("referral:onInstallReferrerServiceDisconnected")));
}
});
}
}

关键神坑解决:
很多童鞋弄完可能收到

utm_source=(not%20set)&utm_medium=(not%20set)
很明显Google那边做了什么不见得人的处理,导致没把referrer传递过来
我们通过链接分析会发现:

  • 1.用户访问:https://play.google.com/store/apps/details?id=com.xxx.xxx&referrer=test
  • 2.点击该页面下面的按钮”在PLAY商店应用中打开”
  • 3.然后细心点就会发现Google做了短链中转处理啊(处理就处理嘛,Google直接把&referrer=test弄没了,弄没了,心塞塞~)
    https://play.app.goo.gl/?link=https://play.google.com/store/apps/details?id=com.xxx.xxx&ddl=1&pcampaignid=web_ddl_1

所以,想实现可以传referrer,要么对上述的链接进行处理,如:
https://play.app.goo.gl/?link=https://play.google.com/store/apps/details?id=com.xxx.xxx
将link后面的链接加上&referrer=test,然后UrlEncode一下
https://play.app.goo.gl/?link=https%3a%2f%2fplay.google.com%2fstore%2fapps%2fdetails%3fid%3dcom.xxx.xxx%26referrer%3dtest

不然或者用这种链接
market://details?id=com.xxx.xxx&referrer=test

最后,你终于就能看到String referrer = details.getInstallReferrer();获取到referrer了(当然你还得先找梯子上架到Google Play才能验证到)。

Android代码实现ColorStateList

发表于 2019-03-29

通常selector都是在drawable/color文件夹中定义好,但有时候一些特殊需求需要我们动态通过代码去更改,这个时候就要用到StateListDrawable 和 ColorStateList 了,分别是设置图片和颜色的类

今天先讲通过代码实现ColorStateList,代码呈现如下:

private static ColorStateList createColorStateList(Context context, int color) {
        int[] colors = new int[]{ContextCompat.getColor(context, color), ContextCompat.getColor(context, R.color.gray)};
        int[][] states = new int[2][];
        states[0] = new int[]{android.R.attr.state_checked};
        states[1] = new int[]{-android.R.attr.state_checked};
        ColorStateList colorList = new ColorStateList(states, colors);
        return colorList;
    }

其中:-android.R.attr.state_checked 和 android.R.attr.state_checked 的区别在于 “-” 号代表值里的true 和 false ,有“-”为false 没有则为true

12…8
Waychel

Waychel

关注互联网、物联网、创业、产品、技术

36 日志
9 标签
© 2014 - 2022 Waychel
粤ICP备14032841号-1