пятница, 1 ноября 2013 г.

Как получить адрес по координатам

public String getCityNameFromLocation(Context context, Double latitude,
   Double longitude) throws IOException {
  String res = "";
  Geocoder gcd = new Geocoder(context, Locale.getDefault());
  List addresses = gcd.getFromLocation(latitude, longitude, 1);
  if (addresses.size() > 0)
   res = addresses.get(0).getLocality();
  return res;
 }

среда, 16 октября 2013 г.

File size limit

//устанавливаем максимальный размер файла
int MAX_IMAGE_SIZE = 2000 * 1024;

String picturePath = ... //абсолютный путь к файлу + имя.расширение

File file = new File(picturePath);
if (file.length() > MAX_IMAGE_SIZE) {
 return false;
} else
 return true;

среда, 9 октября 2013 г.

Телефонные вызовы. Начало, конец звонка.

Для отслеживания начала и окончания звонка необходимо создать класс, наследуемый от BroadcastReceiver.

public class IncomingCallTracker extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle bundle = intent.getExtras();

            Set keys = bundle.keySet();
        for (String key : keys) {
         if(key.equals("state"))
                Log.i("Timing", key + "="+ bundle.getString(key));
        }       
    }

}

А в главном Activity создаем экземпляр класса
в onCreate
br = new IncomingCallTracker();
IntentFilter intFilt = new IntentFilter("action");
registerReceiver(br, intFilt);

дерегистрируем по окончании работы
в onDestroy
unregisterReceiver(br);

Обязательным для возможности совершения телефонного звона является добавление пермишена
<uses-permission android:name="android.permission.CALL_PHONE" />


Телефонные вызовы. Очистка списка истории вызовов

Метод очистки списка истории вызовов
private void deleteNumber(String number) {
  String strUriCalls = "content://call_log/calls";

  Uri UriCalls = Uri.parse(strUriCalls);

  Cursor c = MainActivity.this.getContentResolver().query(UriCalls, null,
    null, null, null);

  if (c.getCount() <= 0) {
   Toast.makeText(getApplicationContext(), "Call log empty",
     Toast.LENGTH_SHORT).show();
  }

  while (c.moveToNext()) {
   String queryString = "NUMBER='" + number + "'";
   Log.v("Timing", queryString);
   int i = MainActivity.this.getContentResolver().delete(UriCalls,
     queryString, null);

   if (i >= 1) {
    Toast.makeText(getApplicationContext(), "Number deleted",
      Toast.LENGTH_SHORT).show();
   } else {
    Toast.makeText(getApplicationContext(),
      "No such number in call logs", Toast.LENGTH_SHORT)
      .show();
   }
  }
 }
еще лучше вызвать удаление звонка после секундной паузы

Runnable mRunnable;
Handler mHandler = new Handler();
mRunnable = new Runnable() {
        @Override
 public void run() {
deleteNumber(number);
        }
};
mHandler.postDelayed(mRunnable, 1000);


ну и конечно же, как выяснилось опытным путем, необходимо добавить пермишены)
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
<uses-permission android:name="android.permission.CALL_PHONE" />

вторник, 8 октября 2013 г.

Base 64 для Android API 7

Что нужно делать, если вдруг у вас оказались в деле смартфоны с API 7, и если нужно закодировать строку в Base64

http://androidcodemonkey.blogspot.ru/2010/03/how-to-base64-encode-decode-android.html

в коде
BaseCustom64.encodeBytes(str.getBytes()));

четверг, 3 октября 2013 г.

среда, 4 сентября 2013 г.

ActionBar on Android 2.2

Как корректно добавить SupportLibrary
http://habrahabr.ru/post/189680/

Как задать background у компонента ActionBar

private void setActionBarBackground() {
        ActionBar ab = getSupportActionBar();
        GradientDrawable gd = new GradientDrawable(
                GradientDrawable.Orientation.TOP_BOTTOM,
                new int[]{0xFFFFFFFF, 0xFF000000});
        gd.setCornerRadius(0f);
        ab.setBackgroundDrawable(gd);
    }

Еще во втором андроиде нужно убирать TitleBar
if (VERSION.SDK_INT < VERSION_CODES.ICE_CREAM_SANDWICH) {
   requestWindowFeature(Window.FEATURE_NO_TITLE);
   ActionBar actionBar = getSupportActionBar();
   setActionBarBackground(actionBar);
  }

check GPS provider

Как осуществить проверку наличия GPS на устройстве
При поиске по locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) вылезает Exception на устройствах, где GPS нет. а эксепшены - это же не наш метод)
поэтому определяем наличие GPS более гуманным способом
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
List providers = new ArrayList();
providers = locationManager.getAllProviders();
for(String s:providers){
 if(s.equals("gps")){
             //GPS есть
        }else{
             //GPS нет
        }

Blogger java/html code formatting

Как оказалось - все просто
проходим путь Шаблон-Изменить HTML-разворачиваем код от тега
 <b:skin>
и вставляем содержимое файлов css из ссылочки
http://blog.cruxframework.org/2011/10/easy-code-syntax-highlight-on-blogger.html

далее нужный фрагмент кода заключаем в тег
<pre class="brush:html">
...
</pre>

или

<pre class="brush:java">
...
</pre>

public class SyntaxHighlighterWorksFineHere

    {
        public static void main(String[] args)
        {
            System.out.println("Hello world!");
        }
    }
 

вторник, 3 сентября 2013 г.

Android 2.2. Диалоги

Вот как нужно разделять стили для разных версий Android
особенность второго в том, что диалоговое окно (кастомное) и при black и light одинаковое, а цвета внутренних компонентов меняются в зависимости от установленного стиля. и вот так получается, что окно всегда темное, а содержимое и темное, и светлое.
в отличие от четвертой версии Андроид.

итак!
нужно разделить стили по папкам - дефолтная, v11,v14
для компонента AutoCompleteTextView в дефолтную прописываем в styles.xml
<style name="LightTheme" parent="@android:style/Theme.Light">
        <item name="android:autoCompleteTextViewStyle">@style/AutoCompleteTextViewLight</item>
        <item name="android:dropDownItemStyle">@style/Widget.DropDownItemLight</item>
    </style>

    <style name="BlackTheme" parent="@android:style/Theme">
        <item name="android:autoCompleteTextViewStyle">@style/AutoCompleteTextViewLight</item>
        <item name="android:dropDownItemStyle">@style/Widget.DropDownItemLight</item>
    </style>

    <style name="AutoCompleteTextViewLight" parent="@android:style/Widget.AutoCompleteTextView">
        <item name="android:textColor">@android:color/primary_text_light</item>
    </style>

    <style name="Widget.DropDownItemLight" parent="@android:style/Widget.DropDownItem">
        <item name="android:textColor">@android:color/primary_text_light</item>
    </style>

 и для компонента ProgressBar
<style name="ProgressBarLight" parent="@android:style/Widget.ProgressBar"> </style> 
а для v11 и v14
<style name="LightTheme" parent="@android:style/Theme.Holo.Light">
      
    </style>

    <style name="BlackTheme" parent="@android:style/Theme.Holo">
    </style>   
  
    <style name="ProgressBarLight" parent="@android:style/Widget.Holo.ProgressBar">
 </style>    






Лирическое отступление №1

буду постить здесь интересные решения, найденные при выполнении задач. вот и начну лучше разбираться, сама для себя уясню много вещей, да и проще потом будет в коде разбираться)
муа)