Я подаю заявку, которая будет одновременно подключена к локальной сети без интернета, но при этом оставаться подключенной к сотовой сети (в которой есть интернет). Я достиг этого, имея два отдельных потока, один поток для 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();
}
}
});
}
}