Я хочу воспроизвести поток RTSP с IP-камеры, подключенной к локальной сети Wi-Fi. Подключение устройства Android к сети вручную и последующее воспроизведение видео работает (я получаю только предупреждение «провайдер контента не найден», но все равно работает) Но если я сделаю запрос NetworkRequest, а затем свяжу процесс с сетью, метод VideoView.setVideoUri
не привязывает сокет к новой сети. Я попытался пропинговать IPCamera с помощью InetAdress.isReachable()
, и он работает, поэтому я предположил, что метод ConnectivityManager.bindProcessToNetwork(network)
работает.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
videoView = findViewById(R.id.videoView_Camera);
connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
mConnectToWifiApi29();
}
else{
mConnectToWifi();
}
@RequiresApi(api = Build.VERSION_CODES.Q)
private void mConnectToWifiApi29(){
WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier.Builder()
.setSsid(myssid)
.setWpa2Passphrase(mypassword)
.build();
NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(wifiNetworkSpecifier)
.build();
if (connectivityManager != null) connectivityManager.requestNetwork(networkRequest, networkCallback);
}
final private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(@NonNull Network network) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
connectivityManager.bindProcessToNetwork(network);
}
else{
ConnectivityManager.setProcessDefaultNetwork(network);
}
mVideo();
super.onAvailable(network);
}
};
private void mVideo() {
runOnUiThread(new Runnable() {
@Override
public void run() {
videoView.setVideoURI(Uri.parse("rtsp://user:password@192.168.1.10));
videoView.requestFocus();
videoView.start();
}
});