我一直在调查这个问题,发现了一些有趣的东西.如果我使用服务器密钥库存储服务器证书与commomn名称作为真实域建立与服务器的连接,它工作正常,但如果我使用IP地址而不是通用名称它不起作用,但只是在Android设备自制应用程序(不是Android设备中的桌面浏览器或浏览器应用程序).noted我使用openssl创建这两个证书/密钥库.

事实证明这个例外是主机名未经验证

但奇怪的是在浏览器中桌面或Android设备都很好

经过调查,我发现实际上我们可以构建自己的主机名验证器,它可以为主机名添加异常,但android的默认验证器是如何工作的?它必须是一些跳过ip地址作为通用名称并返回false的代码.
我检查了okhttp的源代码,发现这行代码正在抛出异常

但我找不到自定义主机名验证码的代码.
有人可以给我一些关于此的提示吗?
谢谢〜
更新::我在android studio中调试后,在运行时它实际上是OkHostnameVerifier
它检查主机名是否为IP地址,如果是,则检查证书中的所有主题备用名称,如果找到匹配则返回true,反之亦然.
private boolean verifyIpAddress(String ipAddress, X509Certificate certificate) {
for (String altName : getSubjectAltNames(certificate, ALT_IPA_NAME)) {
if (ipAddress.equalsIgnoreCase(altName)) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud) Smart Lock弹出对话框只有两个按钮,一个是"never",另一个是"save password".如果用户意外点击"从不",SmartLock将被禁用,直到他使用Chrome应用程序删除"从未保存过的密码"项,这对于"懒惰用户"来说是太多步骤,而且这很可能是用户可能不会永远使用SmartLock
在我们看来,如果用户不想将他的密码只保存到SmartLock一次,很可能他会点击"从不",因为Dialog只有两个按钮......很少有人知道他们是否点击了其他地方屏幕他们可以解雇Dialog ....一旦他们点击从不,他们就失去了享受SmartLock的机会;(所以我们建议谷歌可以为Dialog提供3个按钮,"never","no","保存密码",这将使用户更容易理解他们正在做什么.

我尝试在android studio中使用Proguard,但似乎Proguard并没有混淆类名,例如,我的app结构和配置:
和配置
但是当我尝试在应用程序中触发异常时:
ADB控制台中列出了该异常:
只有方法被混淆,MainActivity.class不是
我刚刚意识到,当我为 Android 应用程序进行重构时,smartlock api 不允许我将 Fragment 传递给 ResolvingResultCallbacks 对象。
API 只允许我将 Activity 作为上下文传递,这意味着我需要在 Activity 的 onActivityResult() 方法而不是 Fragment 方法中处理凭据结果。但是在我们应用程序的当前设计中,我们希望 Fragment 处理智能锁逻辑。
这是我的保存代码:
Auth.CredentialsApi.save(mSmartLockApiClient, credential).setResultCallback(
new ResolvingResultCallbacks<Status>(mActivity, RC_CREDENTIALS_SAVE) {
@Override
public void onSuccess(Status status) {
mSmartLockSaveCallBack.onSuccess();
}
@Override
public void onUnresolvableFailure(Status status) {}
});
Run Code Online (Sandbox Code Playgroud)
实际上,对于请求凭据,我遇到了同样的问题,api 没有提供传递片段以开始解析的方法。但我找到了一个解决方法:
if (status.hasResolution()) {
mFragment.startIntentSenderForResult(
status.getResolution().getIntentSender(),
RC_CREDENTIALS_READ,
null,
0,
0,
0,
null);
}
Run Code Online (Sandbox Code Playgroud) 我有两个工具栏(一个设置为"enterAlways",另一个设置为"scroll")和一个coordinatelayout中的recyclerview,我想要实现的是当recyclelerview没有滚动时捕获滚动事件,这意味着什么时候工具栏已被设置为"enterAlways"仍在滚动.
但是当我尝试使用coordinateLayout.setOnScrollChangeListener()时,它根本不起作用.
我的布局是这样的:
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list_wrapper">
<EndlessRecyclerView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00ff0000"
>
<include app:layout_behavior="com.viki.android.adapter.AbsListener"
android:id="@+id/header_upper" layout="@layout/inlcude_channelheader_upper" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_scrollFlags="scroll"/>
<include android:id="@+id/header_lower" layout="@layout/include_channelheader_lower" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_scrollFlags="enterAlways"/>
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)
我怎么能捕获滚动事件以及dx和dy的值,就像listview或recyclerview的onScrollListener一样.
我有一个创建新 Observable 的用例:
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
final RequestFuture<String> futureRequest = RequestFuture.newFuture();
try{
//getResult() is a sync time consuming http connection
String response = getResult();
subscriber.onNext( response );
subscriber.onCompleted();
Log.e("call method","Thread is about to end" + Thread.currentThread().getId());
}
catch ( Exception e){
subscriber.onError( e );
}
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
Run Code Online (Sandbox Code Playgroud)
因此,正如您所看到的,getResult() 方法是一个 http 调用,它很耗时,而且我是以同步方式进行的。我在 io 线程上订阅它并在 Android 的主线程上观察。
当我检索 observable 并订阅它时:
subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.e("on completed method", "Thread is ending …Run Code Online (Sandbox Code Playgroud) 我已经在RxJava上阅读了一些关于背压的文档,但我无法找到一个详细的解释,比如它是如何在图书馆内部发生的,每个人都只是总结它就像"生产者"太快而"消费者"太慢.
例如,如下面的代码:
Observable.interval(1, TimeUnit.MILLISECONDS)
.observeOn(Schedulers.newThread())
.subscribe(
i -> {
System.out.println(i);
try {
Thread.sleep(100);
} catch (Exception e) { }
},
System.out::println);
Run Code Online (Sandbox Code Playgroud)
我一直在浏览RxJava源代码,所以我的理解是在主线程中我们将在每毫秒发出事件,一旦我们发出它,我们将值传递给System.out.println(i)方法并将其抛入newThead scheduler的线程池并在runnable中运行该方法.
所以我的问题是,异常是如何在内部发生的?因为当我们调用Thread.sleep()时,我们只是睡眠处理方法调用的线程 - > System.out.println()而不影响线程池中的其他线程,它怎么会导致异常.是因为线程池不再具有足够的可用线程了吗?
谢谢
我已经尝试了Google Cast Android示例应用程序,并且正在为5.0以下的设备崩溃.任何人都知道为什么?下面是我的崩溃日志:
0830 12:38:57.242:E/AndroidRuntime(16269):引起:java.lang.RuntimeException:com.google.android.gms.internal.zzsb $ zza:找不到可接受的模块.本地版本为0,远程版本为0. 0830 12:38:57.242:E/AndroidRuntime(16269):at com.google.android.gms.internal.zzni.zzbg(Unknown Source)0830 12:38:57.242:E/AndroidRuntime(16269):at com.google.android.gms.internal.zzni.zza(Unknown Source)0830 12:38:57.242:E/AndroidRuntime(16269):at com.google.android.gms.cast.framework .CastContext.没有加一
我对此表示怀疑,例如,在Java类的main方法中,下面有一些代码:
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
throw new IllegalStateException("sss");
}
}).start();
try {
Thread.sleep(2000);
} catch (Exception e) {
}
System.out.println("xxx");
}
Run Code Online (Sandbox Code Playgroud)
此IllegalStateException不会停止执行主方法,我可以看到我打印了“ xxx”。
但是,在Android开发中,如果我在Activity的oncreate()方法中执行相同的操作,则会使App崩溃。
我想知道Android如何处理这个问题以及为什么它会使应用程序崩溃。
谢谢
logcat日志:
致命异常:线程248
Process: com.abc.android, PID: 3673
java.lang.IllegalStateException: sss
at com.abc.android.MainActivity$1.run(MainActivity.java:80)
at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud) 基本上我使用这些代码进行转换:
echo "<script>";
echo " var img_array=new Array();";
foreach($img_arr as $img_url){
$url=(string)$img_url;
echo "img_array.push('".$url."');";
}
echo "console.log(img_array);";
echo "</script>";
Run Code Online (Sandbox Code Playgroud)
但是,出现错误(firefox调试窗口):
Error: unterminated string literal
Source File: http://127.0.0.1/CubeCart/index.php?_a=account
Line: 1, Column: 42
Source Code:
var img_array=new Array();img_array.push('http://gtms01.alicdn.com/tps/i1/T1mL3LFhhhXXaCwpjX.png
Run Code Online (Sandbox Code Playgroud)
但是在我检查了html页面的源文件之后,脚本显示如下:
<script> var img_array=new Array();img_array.push('http://gtms01.alicdn.com/tps/i1/T1mL3LFhhhXXaCwpjX.png
');img_array.push('http://gtms01.alicdn.com/tps/i1/T1DQtTFsdFXXaCwpjX.png');console.log(img_array);</script>
Run Code Online (Sandbox Code Playgroud)
我没有看到任何错误.
android ×8
java ×2
rx-java ×2
backpressure ×1
google-cast ×1
https ×1
javascript ×1
okhttp ×1
openssl ×1
php ×1
proguard ×1
rx-android ×1
ssl ×1