Вопросы по программированию



Реп: (1391)
Прикрепленное изображение Google Android OS - Программирование
Вопросы по программированию » | Библиотека Android » (Временно не доступна)| FAQ | Каталог Open source программ для Android OS

Обсуждение тонкостей создания программ для Google Android OS.
При написании кода его надо правильно оформлять
[code] и [/code]

При написании большого кода его надо прятать под спойлер
[SPOILER]содержание спойлера[/SPOILER]

Скачать SDK http://developer.android.com/
Android Scripting Environment (ASE) - создание скриптов прямо на устройстве под управлением Android OS.

Всё самое лучшее из этой темы (находится в режиме наполнения)
Запуск бинарников требующих process_vm_readv или process_vm_writev до 23 API
Исправление обнаружения включаемых путей в Eclipse с новым NDK
Использование констант, как параметров в JNI
Баг андроида с пустым View для ListView
Баги расчета высоты элементов разметки в диалогах
Особенности компиляции нативного кода под ARM
Отображение ProgressBar и прочей анимации, когда она отключена, а также управление скоростью анимации
Как попробовать поймать исключения в чужом Runnable внутри Looper
Избегайте хранения View, которые использовались в ListView
Поддержка "плохих" прошивок
Синтетические методы и как избежать их появления
Подводные камни setCompoundDrawables и CheckedTextView
Вызов кода перед конструктором родителя
Особенности инициализации полей класса
Утечки памяти при использовании полей класса для хранения UI виджетов
Поиск багов статическим анализом кода
Перехват нативных функций
Пример запросов под ROOT'ом + ниже... + для общего понимания работы под root(важно!)
Баги popen и нативные краши
Полезная информация о "view" + ещё
Создание формы регистрации и авторизации(для сайта).
Logcat с 10 Android в Eclipse
Совет по сбору логов об ошибках
Пример кода для Dialog'a


И не поступайте как Джон.
Прикрепленное изображение

Обязательно к прочтению!
Уважаемые пользователи, в связи с отсутствием экстрасенсов, никто не сможет ответить на вопрос "Почему крашится приложение?" или "Почему приложение вылетает/force close ?" в случае отсутствия логов. Поэтому все такие вопросы будут удалены.

В теме нет куратора. По вопросам наполнения шапки обращайтесь к модераторам раздела через кнопку Изображение под сообщениями, на которые необходимо добавить ссылки.

Сообщение отредактировал derak1129 - 01.01.22, 07:30
Причина редактирования: Редактирование



Реп: (1391)
Продолжаем.
Как узнать у системы GPS, что она поймала спутники и ее данные валидные и как сразу получить уведомление, при потере спутников?



Реп: (806)
RubberBigPepper,
высокая точность=спутники есть, низкая точность=спутников нет?



Реп: (1391)
thevery @ 22.8.10, 14:51 *
высокая точность=спутники есть, низкая точность=спутников нет?

Как то это неправильно.
Другой способ есть?



Реп: (806)
RubberBigPepper,
должен быть - всякие программы типа gps status ведь умеют показывать кол-во спутников



Реп: (298)
Можно как то так..

final LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setAccuracy(Criteria.ACCURACY_FINE);
final String prov = lm.getBestProvider(criteria,true);

lm.requestLocationUpdates(prov,0,0,new LocationListener(){
public void onLocationChanged(Location loc) {
lm.removeUpdates(this); // у меня одноразовый запрос поэтому сразу удаляю листенера.
}

public void onStatusChanged(String s, int i, Bundle bundle) {
}

public void onProviderEnabled(String s) {
}

public void onProviderDisabled(String s) {
}
});


getBestProvider(criteria,true); вернёт network или null если GPS недоступен, а можно не указывать ACCURACY_COARSE тогда вернет либо GPS либо null.

Ещё у LocationManager есть метод getGpsStatus() он возвращает состояние спутников.
А если это не нужно а нужно просто получить позицию то по листенеру onLocationChanged вернётся валидный локейшн.

Сообщение отредактировал OXOTHuK76 - 23.08.10, 09:20



Реп: (1391)
Я имею в виду, вот включил я свою софтину, она поймала спутники и прочее, показала данные.
Потом пользователь перешел в дом, спутники пропали, вот как это отследить?
onLocationChanged просто перестает вызываться, потому не понятно.
Думаю сделать поток, который будет дергать, проверять, когда данные пришли в последний раз и если прошло более 2 секунд, то все, считать что спутники пропали.



Реп: (298)
Ну есть функция getLastKnownLocation или как то так. Берёшь её периодически ,смотришь внутренний таймстамп и сравниваешь с текущим временем.

Но для этого надо постоянно запрашивать позицию (что бы апдейты на локацию приходили) иначе ГПС просто не будет использоваться.

Сообщение отредактировал OXOTHuK76 - 23.08.10, 10:08



Реп: (1391)
Ладно, отставим это.
Другая проблема: нужно, чтобы приложение нормально реагировало на смену ориентации экрана, вариант с перезапуском(а при этом надо будет поднять все настройки, картинки и прочее, что долго) не устраивает. То есть перезапуск Activity это ладно, пусть.
Потому пишу так:
import android.app.*;

public class CRootApplication extends Application
{
/** главный класс работы*/
private static CGPSCore m_cGPSCore;

public CGPSCore getGPSCore()
{
return m_cGPSCore;
}
@Override
public void onCreate ()
{
super.onCreate();
m_cGPSCore=new CGPSCore(this);//тут поднятие всей системы GPS, сохраненных состояний и прочее
}

@Override
public void onTerminate ()
{
m_cGPSCore.StopGPS(this);//тут сохранение состояний, маршрутов и прочее
super.onTerminate();
}
}

В onTerminate управление не приходит.
Что не так? Естесственно, в манифесте класс приложения подключен.



Реп: (298)
А разве терминейт должен вызываться при повороте экрана?



Реп: (1391)
OXOTHuK76 @ 23.8.10, 16:54 *
А разве терминейт должен вызываться при повороте экрана?

Мне то как раз не нужно чтобы при повороте экрана вызывалось что то.
Мне нужно, чтобы при запуске приложения оно поднялось, один раз все что нужно ему прочитало и далее работало не зависимо от ориентации экрана и его смены.
А вот при выходе из приложения (кстати, как сделать правильный выход? вызвать Activity.finish?) оно один раз все изменения сохранило, память и ресурсы освободило.



Реп: (298)
Что бы не вырубало - нужно жестко указать ориентацию portrait или landscape, тогда по идее не должно постоянно вырубать врубать.
А вообще есть же гугль - он зараза умный - всё знает :)))

Сообщение отредактировал OXOTHuK76 - 23.08.10, 23:25



Реп: (304)
OXOTHuK76 @ 24.8.10, 0:25 *
Мне то как раз не нужно чтобы при повороте экрана вызывалось что то.

Вольное изложение мануала, надеюсь поможет:

public void onConfigurationChanged (Configuration newConfig): вызывается, только если в атрибуте configChanges манифеста задан соответствующий бит.

public static final int configChanges: если бит не установлен (orientation = 0x0080), activity будет *перезапущена* при данном изменении конфигурации системы; если установлен -- activity будет продолжать работу, и будет вызван ее обработчик Activity.onConfigurationChanged (который никто не мешает оставить пустым).

Activity.finish -- вроде правильный метод, но это лишь запрос на завершение, а не реальный аналог exit(). У меня после него приложение могло просто уйти в фон и висеть там до бесконечности (видимо на случай, если оно скоро вдруг понадобится). Самоубийство с высвобождением ресурсов я делаю так:

android.os.Process.killProcess(android.os.Process.myPid());



Реп: (806)
RubberBigPepper,
может проще сделать чтобы не перезапускалось?
onTerminate приходит "опционально"(например, при убивании таск-киллером) и не стоит на него расчитывать, лучше onDestroy

Добавлено 24.08.2010, 10:53:

avs234 @ 24.8.10, 11:50 *
Самоубийство с высвобождением ресурсов я делаю так:
android.os.Process.killProcess(android.os.Process.myPid());

полагаю, что правильнее всё-таки делать
http://developer.android.com/reference/and...va.lang.String)



Реп: (1391)
Всем спасибо, вчера переделал именно так, как тут писали, убрал Application, все сунул в Активити, задал флаги, чтобы оно не перезапускалось.
Пока все отлично было, до тех пор, пока я не решился сегодня отрисовать PNG картинку на канвасе и встрял. Как это сделать? Картинку засунул в Res\drawable-ldpi.
Я так понял свои папки для картинок и звуков в res создавать нельзя? (Еклипса ругается если создаешь левую папку, если же внутри существующих, то проходит).
Как поднять битмапу из ресурсов?
Через "public static Bitmap decodeResource (Resources res, int id)" ?


А, да, забыл сказаь "public void killBackgroundProcesses (String packageName)" не работает, так как требует API 8 и выше, я же использую 4 (Android 1.6).

Сообщение отредактировал RubberBigPepper - 24.08.10, 11:17



Реп: (806)
RubberBigPepper @ 24.8.10, 12:12 *
А, да, забыл сказаь "public void killBackgroundProcesses (String packageName)" не работает, так как требует API 8 и выше, я же использую 4 (Android 1.6).

там есть другой метод, буквально строчкой ниже см в том же классе

RubberBigPepper @ 24.8.10, 12:12 *
Через "public static Bitmap decodeResource (Resources res, int id)" ?

да

RubberBigPepper @ 24.8.10, 12:12 *
Я так понял свои папки для картинок и звуков в res создавать нельзя?

нельзя. папки можно только в asset'ах, увы



Реп: (1391)
Еще один простой вопрос: как из главного активити запустить дочерний, с настройками.
И если можно, то как запретить выходить из главного активити по кнопке "назад", только через пункт меню?



Реп: (806)
RubberBigPepper,
Передать данные через putExtra.
Перехватывать кнопку назад, но так делать крайне не рекомендуется, плюс кнопку с домиком всё равно не перехватить.



Реп: (1391)
Спасибо за ответы.
Через putExtra можно передать свой класс?
Еще вопрос: аналога NumericUpDown или Buddy у андроида нет что ли? Мне нужно поле ввода чисел с двумя стрелками, изменяющих введенное число.



Реп: (806)
RubberBigPepper @ 28.8.10, 9:10 *
Через putExtra можно передать свой класс?

а это уже наглость - спрашивать RTFM вопросы:
http://developer.android.com/reference/and...Parcelable.html

RubberBigPepper @ 28.8.10, 9:10 *
Еще вопрос: аналога NumericUpDown или Buddy у андроида нет что ли? Мне нужно поле ввода чисел с двумя стрелками, изменяющих введенное число.

http://maximyudin.blogspot.com/2010/05/numberpicker.html



Реп: (1391)
аналога NumericUpDown или Buddy у андроида нет что ли?

Спасибо за статью, но не устроило, что в 2.2 не работает.
Потому написал свой Compound Control для этих целей, мож кому пригодиться.
Код:
import android.content.Context;
import android.util.AttributeSet;
import android.view.*;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;

/** Контрол для выбора числового значения из указанного диапазона*/
public class NumericUpDownCtrl extends RelativeLayout implements OnClickListener
{
/** максимальное значение*/
private int m_nMinValue;
/** минимальное значение*/
private int m_nMaxValue;
/** само значение*/
private int m_nValue;
/** кнопка увеличения значения*/
private Button m_cBtnUp;
/** кнопка уменьшения значения*/
private Button m_cBtnDown;
/** текстовое поле ввода*/
private TextView m_cText;

/** само значение*/
public int getValue()
{
return m_nValue;
}
/** установка значения*/
public void setValue(int nValue)
{
if(nValue>=m_nMinValue&&nValue<=m_nMaxValue)
{
m_nValue=nValue;
m_cText.setText(String.valueOf(m_nValue));
}
}
/** минимально возможное значение*/
public int getMinimum()
{
return m_nMinValue;
}
/** установка минимального значения*/
public void setMinimum(int nMinimum)
{
if(nMinimum>=m_nMaxValue)
return;//неправильное значение
m_nMinValue=nMinimum;
if(m_nValue<m_nMinValue)//подрегулируем значение
setValue(m_nMinValue);
}
/** максимально возможное значение*/
public int getMaximum()
{
return m_nMaxValue;
}
/** установка максимального значения*/
public void setMaximum(int nMaximum)
{
if(nMaximum<=m_nMinValue)
return;//неправильное значение
m_nMaxValue=nMaximum;
if(m_nValue>m_nMaxValue)//подрегулируем значение
setValue(m_nMaxValue);
}
/** простой конструктор*/
public NumericUpDownCtrl(Context context)
{
super(context);
m_cBtnUp=null;
m_cBtnDown=null;
m_cText=null;
Initialize(context);
}
/** конструктор с атрибутами*/
public NumericUpDownCtrl(Context context, AttributeSet attrs)
{
super(context,attrs);
m_cBtnUp=null;
m_cBtnDown=null;
m_cText=null;
Initialize(context);
}
/** инициализация, расстановка контролов*/
private void Initialize(Context context)
{
try
{
m_nMinValue=0;
m_nMaxValue=100;
m_nValue=m_nMinValue;
if(context==null)
return;
//создаем контролы, настраиваем, подписываемся на их события
m_cBtnUp=new Button(context);
m_cBtnUp.setOnClickListener(this);
m_cBtnUp.setText(" + ");
m_cBtnUp.setId(1000);//без ИД не работает в рулях
m_cBtnDown=new Button(context);
m_cBtnDown.setOnClickListener(this);
m_cBtnDown.setText(" - ");
m_cBtnDown.setId(2000);//без ИД не работает в рулях
m_cText=new EditText(context);
m_cText.setText(String.valueOf(m_nValue));
m_cText.setEnabled(false);
//размещаем контролы
RelativeLayout.LayoutParams cLParam=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.FILL_PA
RENT);
cLParam.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
addView(m_cBtnDown,cLParam);
cLParam=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.FILL_PA
RENT);
cLParam.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
addView(m_cBtnUp,cLParam);
cLParam=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.FILL_PA
RENT);
cLParam.addRule(RelativeLayout.CENTER_HORIZONTAL);
cLParam.addRule(RelativeLayout.CENTER_VERTICAL);
cLParam.addRule(RelativeLayout.RIGHT_OF,m_cBtnDown.getId());
cLParam.addRule(RelativeLayout.LEFT_OF,m_cBtnUp.getId());
addView(m_cText,cLParam);
}
catch(Exception ex)
{

}
}

@Override
/** обработчик нажатия кнопок*/
public void onClick(View v)
{
if(v==m_cBtnUp)
{//нажали кнопку увеличения
setValue(getValue()+1);
}
if(v==m_cBtnDown)
{//нажали кнопку уменьшения
setValue(getValue()-1);
}
}
}


Полная версия   Текстовая версия

Помощь   Правила

Сейчас: 03.06.23, 05:30