Android Volley Https SSL 自签名和 Google Maps API

2024-03-19

我们正在使用 Android Volley 并使用可以正常工作的自认证 SSL,但现在我们想要实现 Google 地图,但它不起作用;它只是不会抛出任何错误,它只是显示一个灰色的屏幕

enter image description here This is our implementation of Volley:

public class AppSingleton {
private static AppSingleton mAppSingletonInstance;
private RequestQueue mRequestQueue;
private static Context mContext;

private AppSingleton(Context context) {
    mContext = context;
    mRequestQueue = getRequestQueue();
}

public static synchronized AppSingleton getInstance(Context context) {
    if (mAppSingletonInstance == null) {
        mAppSingletonInstance = new AppSingleton(context);
    }
    return mAppSingletonInstance;
}

private RequestQueue getRequestQueue() {
    if (mRequestQueue == null) {
        mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext(), new HurlStack(null, getSocketFactory()));
    }
    return mRequestQueue;
}

public <T> void addToRequestQueue(Request<T> req, String tag) {
    req.setTag(tag);
    getRequestQueue().add(req);
}

这是我们的 getSocketFactory:

private SSLSocketFactory getSocketFactory() {

CertificateFactory cf = null;
try {
    cf = CertificateFactory.getInstance("X.509");
    InputStream caInput = mContext.getResources().openRawResource(OUR_CERT);
    Certificate ca;
    try {
        ca = cf.generateCertificate(caInput);
        Log.e("CERT", "ca=" + ((X509Certificate) ca).getSubjectDN());
    } finally {
        caInput.close();
    }


    String keyStoreType = KeyStore.getDefaultType();
    KeyStore keyStore = KeyStore.getInstance(keyStoreType);
    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", ca);


    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);


    HostnameVerifier hostnameVerifier = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {

            Log.e("CipherUsed", session.getCipherSuite());
            return hostname.compareTo("OUR_SERVER_HOSTNAME")==0;

        }
    };


    HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
    SSLContext context = null;
    context = SSLContext.getInstance("TLS");

    context.init(null, tmf.getTrustManagers(), null);
    HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());

    SSLSocketFactory sf = context.getSocketFactory();


    return sf;

} catch (CertificateException | NoSuchAlgorithmException | KeyStoreException | IOException | KeyManagementException e) {
    e.printStackTrace();
}

return  null; }

MapActivity 是 Android Studio 创建的通用活动:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps2);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    // Add a marker in Sydney and move the camera
    LatLng sydney = new LatLng(-34, 151);
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}}

及其位置:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cat.amb.parcandride.MapsActivity" />

在activity_maps.xml中

我们如何实现地图活动?谢谢你!


尝试将谷歌地图客户端调用添加到 hostnameVerifier:

return hostname.compareTo("OUR_SERVER_HOSTNAME")==0 ||主机名.compareTo("clients4.google.com") == 0;

由于某种原因,一旦使用 HostnameVerifier 类,对 API 的调用就会被您的代码捕获。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Volley Https SSL 自签名和 Google Maps API 的相关文章

随机推荐

  • 如何禁用apache2中的mod_deflate?

    如何在 Apache2 中禁用 mod deflate 对于特定目录中的文件 OR 对于所有具有扩展名的文件 例如 py 您可以设置环境变量no gzip http httpd apache org docs 2 2 mod mod def
  • MAVEN_OPTS 与 mvn -D

    我认为两者都定义了相同的 JVM 属性 但两者之间显然存在差异 我找不到明确的解释 如果我在构建的 Jenkins Maven 中使用两者 则只有 D 设置的属性在 System getProperties 的 Java 应用程序中可见 尽
  • p:fileDownload bean方法被调用但文件下载不显示

    您好 我正在使用 JSF 和 Primefaces 进行文件上传和下载相同的文件操作 我结合使用来自不同论坛和博客的技术 BelusC 的博客和 Primefaces Showcase 该操作的主要思想是让用户上传文件并 为上传的文件生成一
  • 数据库连接应该是单例吗?

    Java 中创建单例的最佳方式是什么 数据库连接应该是单例 作为单例它自动是线程安全的 因为理论上数据库不能被许多用户同时访问 数据库连接通常不应是单例 两个原因 许多数据库驱动程序都不是线程安全的 使用单例意味着如果您有许多线程 它们将共
  • 从 phpmailer 获取原始 rfc822 消息

    我正在尝试使用 google api php client 和 gmail api 来允许我的用户验证他们的 gmail 帐户并通过我的网站发送电子邮件 我问了一个更通用的问题 https stackoverflow com questio
  • 时间:2019-03-17 标签:c#Linqselect不同的日期时间天

    我有以下方法 我计划返回一堆不同的日期时间对象 我所说的独特是指独特的日子 不包括时间 问题是 DateTime 对象具有不同的时间 因此即使它们是同一天 也会被评估为唯一 如何让查询忽略日期的时间部分并仅评估日期的唯一性 public L
  • 为什么我的类没有通过“def __init__”或“def __init__”初始化?为什么我会收到“不带参数”类型错误或属性错误?

    如果您的问题作为与此重复的问题而被关闭 那是因为您有一个代码示例 其中包含以下内容 class Example def int self parameter self attribute parameter or class Example
  • 从 DBMS_SCHEDULER 运行 exe

    我是 DBMS SCHEDULER 的新手 我面临一些问题 我想运行 exe所以我创建了一个工作 begin sys dbms scheduler create job job name gt FTREC EXE 1 job type gt
  • 类模板参数推导完美转发

    我想了解演绎指南如何与通用参考一起使用std forward 特别是创建完美的转发包装器 下面的代码提供了在两种情况下试验函子包装器的代码 一种具有隐式推导指南 一种具有显式推导指南 我已经放了很多 and std forward在评论中
  • 如何按列对多维数组进行排序?

    有没有办法使用 sort 方法或任何其他方法按列对列表进行排序 可以说我有清单 John 2 Jim 9 Jason 1 我想对其进行排序 使其看起来像这样 Jason 1 John 2 Jim 9 做到这一点的最佳方法是什么 Edit 现
  • 错误:生成未知

    我正在尝试按照教程进行操作https docs angularjs org tutorial https docs angularjs org tutorial并且运行命令时出错 npm run protractor 这是控制台日志 Mic
  • 从 Woocommerce 中的产品 ID 获取所有订单 ID

    如何按产品 ID 获取包含订单 ID 的数组 我的意思是接收所有展示特定产品的订单 我知道如何通过 MySQL 来做到这一点 但是有没有办法通过WP Query功能 Updates 2017 SQL 查询更改为 SELECT DISTINC
  • Lime vs TreeInterpreter 用于解释决策树[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 石灰来源 https github com marcotcr lime https github com marcotcr lime 树解
  • 如何使用skia Sharp在画布上绘制PDF?

    我参考了skia的官方文档 https learn microsoft com en us dotnet api skiasharp skcanvas view skiasharp 1 68 1 constructing a pdf doc
  • C Master Volume Windows 中的 __uuidof

    我想用 C 改变主音量 但是 uuidof仅适用于 C 我可以用什么来代替它 const CLSID CLSID MMDeviceEnumerator uuidof MMDeviceEnumerator const IID IID IMMD
  • 在JavaScript中使用bind来避免闭包是否正确?

    闭包对于浏览器的内存来说是否太糟糕了 在 JavaScript 中使用 bind 避免闭包是一个好方法吗 现有代码 var oControl new Control var self this click function e closur
  • 我正在尝试使用 Firebase 在 Flutter 中使用 google 注销,但它不起作用

    我将 Flutter 与 Firebase 结合使用 当我尝试使用电子邮件和密码注销时 效果很好 但当我尝试使用谷歌时 它不起作用 这是我的代码 try switch user providerData 0 providerId case
  • IIS7 集成与经典管道 - 哪个使用更多 ASP.NET 线程?

    通过集成管道 所有请求都通过 ASP NET 传递 包括图像 CSS 而在经典管道中 默认情况下仅通过 ASP NET 传递对 ASPX 页面的请求 集成管道会对线程使用产生负面影响吗 假设我从 IIS 服务器请求 500 MB 二进制文件
  • Eclipse Oxygen 的 Lombok 问题

    我最近升级到了新的 Eclipse 版本 Oxygen 我从网站下载了 lombok jar 并安装了它 这就是如何eclipse ini安装后的样子 startup plugins org eclipse equinox launcher
  • Android Volley Https SSL 自签名和 Google Maps API

    我们正在使用 Android Volley 并使用可以正常工作的自认证 SSL 但现在我们想要实现 Google 地图 但它不起作用 它只是不会抛出任何错误 它只是显示一个灰色的屏幕 This is our implementation o