Крашится приложение в Android Studio (Java) при попытке отправить запрос с помощью HttpUrlConnection
Пытаюсь сделать приложение, которое с помощью OpenWeatherMap API показывает погоду в твоем текущем местоположении. Местоположение определяется с помощью GPS и Network. Определение местоположения работает корректно, все, что мне осталось - отправить GET запрос и запарсить JSON, но уже долгое время сталкиваюсь с трудностью, решение которой найти нигде не смог. Суть такая: устанавливаю соединение с помощью openConnection(), и при любой попытке взаимодействия с соединением (будь то даже получение кода ответа) само приложение вылетает. Пробовал просто отправить GET в пустом проекте - аналогично. А отладка отбрасывает в файл ActivityThread.
case DUMP_PROVIDER:
handleDumpProvider((DumpComponentInfo)msg.obj);
break;
Файл Манифеста:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.location">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Ну и файл MainActivity:
@Override
public void onCreate(Bundle savedInstanceState) { // Application start
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); //Check if GPS is available
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER); // Check if Network is
available
View = (TextView) findViewById(R.id.View);
View2 = (TextView) findViewById(R.id.View2);
Response = this.getData(20000, "UTF-8", "http://api.openweathermap.org/data/2.5/weather?
q=London&appid=ТУТ_МОЙ_ТОКЕН" ); //Вызывается метод для запроса
View2.setText(Response); //Должно вывести результат в TextView.
if (!gps_enabled && !network_enabled) {
View.setText("Nothing is enabled");
}
if (gps_enabled)
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000, 2, locationListenerGps);
//Start GPS; check each 2 metres or 2 minutes
if (network_enabled)
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 120000, 2,
locationListenerNetwork); //Start Network; check each 2 metres or 2 minutes
timer = new Timer();
timer.schedule(new GetLastLocation(), 20000); // If GPS and Network doesn't start too long -
activate
}
public String getData(int _timeout, String _encoding, String _url) { //Тот самый метод
try {
URL url = new URL(_url);
HttpURLConnection connect = (HttpURLConnection) url.openConnection();
connect.setRequestMethod("GET");
connect.setRequestProperty("Content-Type", "application/json");
connect.setRequestProperty("Content-length", "0");
connect.setUseCaches(false);
connect.setAllowUserInteraction(false);
connect.setConnectTimeout(_timeout);
connect.setReadTimeout(_timeout);
connect.setInstanceFollowRedirects(false);
connect.getRequestMethod();
//connect.connect(); //На этом моменте краш
int status = connect.getResponseCode(); //И тут краш
switch (status) {
case 200:
case 201:
BufferedReader br = new BufferedReader(new InputStreamReader(
connect.getInputStream(), _encoding));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
return sb.toString();
}
} catch (MalformedURLException ex) {
//код обработки ошибки
} catch (IOException ex) {
//код обработки ошибки
}
return null;
}
Думаю методы, связанные с местоположением вам не нужны, но если понадобятся - скину.