Спасибо, вы сохранили мой месяц!

ботаем с Android Volley и используем самостоятельно сертифицированный SSL, который работает правильно, но теперь мы хотим внедрить Google Maps, и он не работает; он просто не выдает никакой ошибки, он просто показывает серый экран

Это наша реализация 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

Как мы могли бы реализовать действие карты? Спасибо!

 xomena21 окт. 2017 г., 23:50
Есть ли у вас сообщение об ошибке в журналах? Может быть, что-то о ключе API и аутентификации?
 Barns19 окт. 2017 г., 18:17
Пожалуйста, покажите код, где вы реализуете карту и укажите ее местоположение.
 Ramon23 окт. 2017 г., 10:03
@xomena да, «Не удалось загрузить карту. Ошибка при подключении к серверам Google. Вероятно, это проблема аутентификации», но: 1) не в первый раз, когда я вхожу в карту, а во второй раз; и 2) только после использования фабрики SSL; то есть, если я получаю доступ к приложению непосредственно к карте, оно работает отлично

Ответы на вопрос(1)

Решение Вопроса

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

по какой-то причине вызов API перехватывается вашим кодом после использования класса HostnameVerfiier.

 Ramon25 окт. 2017 г., 14:14
Спасибо, вы сохранили мой месяц!

Ваш ответ на вопрос