Подключены к локальным (без интернета) и сотовым сетям и карты MapBox не загружаются - PullRequest
0 голосов
/ 16 октября 2019

Я подаю заявку, которая будет одновременно подключена к локальной сети без интернета, но при этом оставаться подключенной к сотовой сети (в которой есть интернет). Я достиг этого, имея два отдельных потока, один поток для Wi-Fi и один поток для сотовой связи с помощью диспетчера подключения. Я пытаюсь использовать MapBox для отображения карты, используя сотовые данные. Однако, когда я запускаю приложение, карта не загружается, потому что он пытается перейти на сервер MapBox через Wi-Fi, который не имеет интернета. Как мне указать, чтобы карты MapBox передавались по сотовым данным?

В настоящее время приложение имеет половину экрана карты MapBox, а другая половина имеет кнопку, которая, когда вы нажимаете ее, выдает сетевой идентификатор Wifi, к которому она подключена, и отображается в текстовом представлении. Цель состоит в том, чтобы часть экрана обновлялась по сотовой сети при увеличении и уменьшении масштаба. В то же время вы можете нажать кнопку Wi-Fi и отправлять информацию по Wi-Fi. Будучи подключен к Wi-Fi и сотовой связи одновременно. Не уверен, как указать для Mapbox Maps, чтобы перейти через сотовую связь. В прошлом, чтобы указать сотовую связь, я всегда подключался к URL. Однако я не вижу, где подключиться к URL с помощью MapBox. Или есть другой способ сказать MapBox использовать сотовую связь. Нужно ли мне использовать что-то вроде connectivityManager.bindprocesstonetwork? Заранее спасибо!

MainActivity.java

package com.example.multinetwork_mapbox;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
import com.mapbox.mapboxsdk.maps.Style;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import java.net.InetAddress;
import java.net.InetSocketAddress;

public class MainActivity extends AppCompatActivity {

    private MapView mapView;

    //for wifi button
    TextView wifiResultTextView;
    forceWifiNetwork wifiNetwork;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Mapbox.getInstance(this, "YOUR_MAPBOX_ACCESS_TOKEN");
        setContentView(R.layout.activity_main);
        mapView = findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(@NonNull MapboxMap mapboxMap) {
                mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() {
                    @Override
                    public void onStyleLoaded(@NonNull Style style) {

// Map is set up and the style has loaded. Now you can add data or make other map adjustments.


                    }
                });
            }
        });


        //setting up wifi text view
        wifiResultTextView = findViewById(R.id.wifiResultTextView);

        //network variables
        wifiNetwork = new forceWifiNetwork(this);

    }

    @Override
    public void onStart() {
        super.onStart();
        mapView.onStart();
    }

    @Override
    public void onResume() {
        super.onResume();
        mapView.onResume();

        //set network to null
        wifiNetwork.mWifiNetwork = null;

        //establish connection
        wifiNetwork.wifiConnect();

        //setting standard message
        wifiResultTextView.setText("Refresh for latest network ID.\n OnResume resets text views");


    }


    public void pingWifi(View view){



        if(wifiNetwork.mWifiNetwork != null){
            try {

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            wifiResultTextView.setText("Network ID: " + wifiNetwork.mWifiNetwork.toString());
                            Log.i("Wifi Network Button", "Network Connected:  " + wifiNetwork.mWifiNetwork.toString());


                        } catch (Exception e) {
                            wifiResultTextView.setText("Not Connected to Network");
                            Log.i("Wifi Network Button", "Network Not Connected");
                        }
                    }
                }).start();


            }catch (Exception e){
                Log.i("ERROR","Error in wifi button");
            }
        }else {
            Log.i("Wifi Button","Wifi Network is null");
            wifiResultTextView.setText("Not Connected to Network - null");
        }


    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onStop() {
        super.onStop();
        mapView.onStop();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

}

forceWifiNetwork.java

public class forceWifiNetwork {

    Context mContext;
    public Network mWifiNetwork;
    final ConnectivityManager manager;


    public forceWifiNetwork(Context mContext){
        this.mContext = mContext;
        manager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    }

    public void wifiConnect(){


        NetworkRequest.Builder wifiBuilder = new NetworkRequest.Builder();
        wifiBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
        manager.requestNetwork(wifiBuilder.build(),new ConnectivityManager.NetworkCallback(){

            @Override
            public void onAvailable(Network network){
                try{
                    mWifiNetwork = network;
                    Log.i("NETWORK",network.toString());
                    Log.i("mWifiNetwork in onAvailable",mWifiNetwork.toString());

                }catch (Exception e){
                    Log.i("onAvailable ERROR", "Error in onAvailable wifi method");
                    e.printStackTrace();
                }
            }
        });


    }

}

forceCellNetwork.java (Этот Java-класс предназначен для подключения к сотовой сети)

public class forceCellNetwork {

    Context mContext;
    private ConnectivityManager.NetworkCallback mMobileNetworkCallback;
    public Network mMobileNetwork;
    final ConnectivityManager manager;


    public forceCellNetwork(Context mContext){
        this.mContext = mContext;
        manager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    }



    public void cellConnect(){

        NetworkRequest.Builder mobileBuilder = new NetworkRequest.Builder();
        mobileBuilder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
        //mobileBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
        manager.requestNetwork(mobileBuilder.build(),new ConnectivityManager.NetworkCallback(){

            @Override
            public void onAvailable(Network network){
                try{
                    mMobileNetwork = network;
                    Log.i("NETWORK",network.toString());
                    Log.i("mMobileNetwork in onAvailable",mMobileNetwork.toString());

                }catch (Exception e){
                    Log.i("onAvailable ERROR", "Error in onAvailable cell method");
                    e.printStackTrace();
                }
            }
        });

    }

}

...