Показы | 24 894 |
Взаимодействия | 437 кликов |
Коэффициент взаимодействия | 1,76 % CTR |
Средн. цена | 0,02 $ за клик |
Стоимость | 9,60 $ |
Показы | 24 894 |
Взаимодействия | 437 кликов |
Коэффициент взаимодействия | 1,76 % CTR |
Средн. цена | 0,02 $ за клик |
Стоимость | 9,60 $ |
@echo off
:start
fastboot getvar battery-voltage
fastboot reboot-bootloader
ping /n 6 localhost >nul
goto start
Скрипт все время с небольшой задержкой перегружает устройство, тем самым оно по чуть-чуть заряжается.
Сперва подумали, что нужно вставить в планшет нормальную симку, а не LTE, но мой планшет вообще устанавливал приложение с Google Play без симки.
В итоге: где-то вычитал, что некоторые планшеты почему-то не могут совершать звонки.
Т.к. в нашем приложении вызов службы поддержки - это вспомогательный функционал, то прописали в манифесте необязательность телефонных вызовов:
После того, как прописали необязательность телефонных звонков, в Google Play к 5200-м поддерживаемым устройствам добавилось еще 500 устройств, в том числе Samsung Galaxy Tab 4. Проблема решилась!
Соответствие разрешений (uses-permission) и функций (uses-feature) можно посмотреть здесь:
http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions-features org.apache.http.NoHttpResponseException: The target server failed to respondПотом локализовал ошибку. Вот фрагмент проблемного кода:
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);//тайм-аут подключения
HttpConnectionParams.setSoTimeout(httpParams, 10000);//тайм-аут сокета
HttpClient httpClient = new DefaultHttpClient(httpParams);
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);//тут выбрасывается Exception
Попробовал переписать код так (без HTTP-параметров).:
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
Статистика в приложении начала работать. Т.е. дело оказалось в передаваемых параметрах. Мне кажется, провайдер хостинга что-то обновил, и теперь сервер перестал понимать передаваемые запросы.
Погуглив, нашел другой способ передачи параметров, способ - работает!
HttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setParameter(HttpConnectionParams.CONNECTION_TIMEOUT, 5000);
httpClient.getParams().setParameter(HttpConnectionParams.SO_TIMEOUT, 10000);
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
Как видно из приведенного выше кода:
[2014-05-09 23:36:21 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace. [2014-05-09 23:36:21 - HelloJni] Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.И снова решение проблемы плохо гуглиться: в основном предлагают откатить или обновить версию SDK. После гугления вспомнил, как решается проблема. Нужно чтобы целевая версия SDK совпадала в манифесте приложения (AndroidManifest.xml) и в свойствах проекта (project.properties) Например, в представленных ниже фрагментах указана 19-я версия SDK. AndroidManifest.xml:
project.properties:
# Project target.
target=android-19
Кодовое название | Версия | Уровень API |
---|---|---|
- | 1.0 | API level 1 |
- | 1.1 | API level 2 |
Cupcake | 1.5 | API level 3, NDK 1 |
Donut | 1.6 | API level 4, NDK 2 |
Eclair | 2.0 | API level 5 |
Eclair | 2.0.1 | API level 6 |
Eclair | 2.1 | API level 7, NDK 3 |
Froyo | 2.2.x | API level 8, NDK 4 |
Gingerbread | 2.3 - 2.3.2 | API level 9, NDK 5 |
Gingerbread | 2.3.3 - 2.3.7 | API level 10 |
Honeycomb | 3.0 | API level 11 |
Honeycomb | 3.1 | API level 12, NDK 6 |
Honeycomb | 3.2.x | API level 13 |
Ice Cream Sandwich | 4.0.1 - 4.0.2 | API level 14, NDK 7 |
Ice Cream Sandwich | 4.0.3 - 4.0.4 | API level 15, NDK 8 |
Jelly Bean | 4.1.x | API level 16 |
Jelly Bean | 4.2.x | API level 17 |
Jelly Bean | 4.3.x | API level 18 |
KitKat | 4.4 - 4.4.2 | API level 19 |
Finalizing a Cursor that has not been deactivated or closedИли
android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened hereИзначально было понятно, что где-то не закрывается курсор. Перепроверил все курсоры, после использования все курсоры закрываются. Причем, стек ошибок показывал фрагмент, где именно ошибка, но понял это лишь под отладкой. Вот фрагмент косячного кода:
public int getBufferCount(){
String sql = "SELECT COUNT(*) FROM " + TBL_BUFFER;
Cursor cursor = db.rawQuery(sql, null);
cursor.moveToFirst();
if(!cursor.isAfterLast()){
return cursor.getInt(0);//ошибка
}
cursor.close();
return 0;
}
Т.е. я делал return cursor.getInt(0);, а курсор оставался открытым!
Исправленный вариант №1:
public int getBufferCount(){
String sql = "SELECT COUNT(*) FROM " + TBL_BUFFER;
Cursor cursor = db.rawQuery(sql, null);
cursor.moveToFirst();
int ret = 0;
if(!cursor.isAfterLast()){
ret = cursor.getInt(0);
}
cursor.close();
return ret;
}
Исправленный вариант №2:
public int getBufferCount(){
String sql = "SELECT COUNT(*) FROM " + TBL_BUFFER;
Cursor cursor = db.rawQuery(sql, null);
cursor.moveToFirst();
if(!cursor.isAfterLast()){
try{
return cursor.getInt(0);
}finally{
cursor.close();
}
}
cursor.close();
return 0;
}
p.s.: Всё, что имеет метод close(), должно быть closed!
public static String doubleToDegree(double value){
int degree = (int) value;
double rawMinute = Math.abs((value % 1) * 60);
int minute = (int) rawMinute;
int second = (int) Math.round((rawMinute % 1) * 60);
return String.format("%d° %d′ %d″", degree,minute,second);
}
Пример использования:
System.out.println(doubleToDegree(37.422006));//Результат: 37° 25′ 19″
System.out.println(doubleToDegree(-122.084095));//Результат: -122° 5′ 3″
Результаты можно интерпретировать следующим образом:
37° 25′ 19″ означает 37 градусов 25 минут 19 секунд северной широты.
-122° 5′ 3″ означает 122 градуса 5 минут 3 секунды западной долготы.