小编Qin*_*ing的帖子

在服务器证书中使用IP地址作为通用名称在Android中不起作用?

我一直在调查这个问题,发现了一些有趣的东西.如果我使用服务器密钥库存储服务器证书与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)

ssl https android openssl okhttp

5
推荐指数
1
解决办法
7859
查看次数

为什么Google Smart Lock Dialog只有两个选项"never"和"save"而没有"no"?

Smart Lock弹出对话框只有两个按钮,一个是"never",另一个是"save password".如果用户意外点击"从不",SmartLock将被禁用,直到他使用Chrome应用程序删除"从未保存过的密码"项,这对于"懒惰用户"来说是太多步骤,而且这很可能是用户可能不会永远使用SmartLock

在我们看来,如果用户不想将他的密码只保存到SmartLock一次,很可能他会点击"从不",因为Dialog只有两个按钮......很少有人知道他们是否点击了其他地方屏幕他们可以解雇Dialog ....一旦他们点击从不,他们就失去了享受SmartLock的机会;(所以我们建议谷歌可以为Dialog提供3个按钮,"never","no","保存密码",这将使用户更容易理解他们正在做什么. 在此输入图像描述

android google-smartlockpasswords

5
推荐指数
1
解决办法
1728
查看次数

Proguard不会混淆类名,只有方法被混淆

我尝试在android studio中使用Proguard,但似乎Proguard并没有混淆类名,例如,我的app结构和配置:

在此输入图像描述

和配置

在此输入图像描述

但是当我尝试在应用程序中触发异常时:

在此输入图像描述

ADB控制台中列出了该异常:

在此输入图像描述

只有方法被混淆,MainActivity.class不是

android proguard android-proguard

4
推荐指数
1
解决办法
8872
查看次数

如何使用 Fragment 来启动 Smartlock 保存而不是使用 Activity

我刚刚意识到,当我为 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)

android android-fragments google-smartlockpasswords

4
推荐指数
1
解决办法
369
查看次数

如何在Android中的CoordinateLayout中捕获滚动事件

我有两个工具栏(一个设置为"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一样.

android android-coordinatorlayout android-appbarlayout

3
推荐指数
1
解决办法
5131
查看次数

订阅者的 onNext() 方法在哪个线程上运行?

我有一个创建新 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)

multithreading android rx-java rx-android

2
推荐指数
1
解决办法
2863
查看次数

Backpressure如何在RxJava内部发生

我已经在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()而不影响线程池中的其他线程,它怎么会导致异常.是因为线程池不再具有足够的可用线程了吗?

谢谢

java multithreading backpressure rx-java

2
推荐指数
1
解决办法
245
查看次数

Google Cast SDK3 Android示例应用程序在5.0以下的设备上崩溃

我已经尝试了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.没有加一

android google-cast

1
推荐指数
1
解决办法
807
查看次数

在其他线程中抛出异常会导致主线程崩溃吗?

我对此表示怀疑,例如,在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)

java multithreading android exception-handling

1
推荐指数
1
解决办法
1203
查看次数

将PHP数组转换为Javascript数组

基本上我使用这些代码进行转换:

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)

我没有看到任何错误.

javascript php

-1
推荐指数
1
解决办法
113
查看次数