Советы

Кот учёный

Пишем собственную функцию md5() для вычисления хэша строки
Как включить вибрацию?
Как включить и выключить бесшумный режим?
Определить системную локаль на устройстве
Как заблокировать экран в приложении?
Узнать размеры экрана
В чем разница между fill_parent и match_parent
Как убрать заголовок у Activity?
Как использовать собственный значок для программы
Получить номер версии программы
Убить приложение
Сколько используется памяти
Как заполнить фон повторяющимся изображением (черепицей)
Как сделать скриншот на эмуляторе
Меняем ориентацию экрана на эмуляторе
Запретить автоматическую смену ориентации при повороте устройства
Показать список недавно запущенных программ
Может ли ваше устройство работать с PDF-файлами
Советы для Eclipse

Пишем собственную функцию md5() для вычисления хэша строки

У PHP-программистов есть готовая функция md5(), которая вычисляет MD5 хэш строки с использованием алгоритма MD5 RSA Data Security и возвращает этот хэш. Хэш представляет собой 32-значное шестнадцатеричное число. Напишем собственную функцию на Java:


private String md5(String in) {
	MessageDigest digest;
	try {
		digest = MessageDigest.getInstance("MD5");
		digest.reset();
		digest.update(in.getBytes());
		byte[] a = digest.digest();
		int len = a.length;
		StringBuilder sb = new StringBuilder(len << 1);
		for (int i = 0; i < len; i++) {
			sb.append(Character.forDigit((a[i] & 0xf0) >> 4, 16));
			sb.append(Character.forDigit(a[i] & 0x0f, 16));
		}
		return sb.toString();
	} catch (NoSuchAlgorithmException e) {
		e.printStackTrace();
	}
	return null;
}

Осталось применить её где-нибудь:


public void onClick(View v) {
	String mypassword = "cat";
	String securepassword = md5(mypassword); // теперь содержит хэш
	tvInfo.setText(securepassword); // выводим результат в TextView
}

Как включить вибрацию?

Общий код:


(Vibrator) getSystemService(Context.VIBRATOR_SERVICE).vibrate(milliseconds);

Например, включить вибро-режим на одну секунду


Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

long milliseconds = 1000;
v.vibrate(milliseconds);

Можно также использовать определенный шаблон, например, 500 миллисекунд на виброзвонок, затем пауза на 300 миллисекунд - комбинацию повторить 3 раза.


Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

long[] pattern = { 500, 300 };
v.vibrate(pattern, 5);

Как включить и выключить бесшумный режим?


AudioManager audiomanager = (AudioManager) getBaseContext()
		.getSystemService(Context.AUDIO_SERVICE);

audiomanager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); // обычный режим
audiomanager.setRingerMode(AudioManager.RINGER_MODE_SILENT); // без звука
audiomanager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); // виброрежим

Как заблокировать экран в приложении?


KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE); 
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE); 
lock.disableKeyguard(); 

Узнать размеры экрана

Для вычисления размеров экрана можно воспользоваться двумя способами. Второй способ более правильный.


TextView tvResult = (TextView)findViewById(R.id.textView1);

// Узнаем размеры экрана из ресурсов
DisplayMetrics displaymetrics = getResources().getDisplayMetrics();

// узнаем размеры экрана из класса Display
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metricsB = new DisplayMetrics();
display.getMetrics(metricsB);

tvResult.setText(
		"[Используя ресурсы] \n" +
    	"Ширина: " + displaymetrics.widthPixels + "\n" +
    	"Высота: " + displaymetrics.heightPixels + "\n"
    	+ "\n" +
    	"[Используя Display] \n" +
    	"Ширина: " + metricsB.widthPixels + "\n" +
    	"Высота: " + metricsB.heightPixels + "\n"
    );

В чем разница между fill_parent и match_parent

match_parent = fill_parent. Первое свойство нужно использовать в новых проектах, второе свойство считается устаревшим и пока оставлено в целях совместимости.

Как убрать заголовок у Activity?

В некоторых случаях хочется спрятать заголовок (Title) у программы. Есть несколько способов. Например, применить специальную тему (прописать в манифесте файла):


<activity 
    android:name=".MainActivity" 
    android:label="My App"
    android:theme="@android:style/Theme.Black.NoTitleBar"
    android:screenOrientation="portrait">

Также попробуйте android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" (убирает не только заголовок, но и панель уведомлений). Названия тем могут быть и другими, смотрите документацию. Несколько примеров

Если у вас используется своя тема, то используйте в ней параметр:

<item name="android:windowNoTitle">true</item>

Также существует программный способ (перед вызовом setContentView):


// Убираем заголовок
this.requestWindowFeature(Window.FEATURE_NO_TITLE);

// Убираем панель уведомлений
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

Как использовать собственный значок для программы

Когда вы создаете учебные примеры, то у всех программ используется стандартный значок с изображением андроида. Как же использовать свой значок? Ответ прост. В папке проекта /res вы можете видеть подпапки drawable-ldpi, drawable-mdpi и drawable-hdpi, в которых и содержатся готовые значки в формате PNG под разные виды телефонов.

Вы можете просто открыть png-файл в графическом редакторе и нарисовать что-то свое и сохранить изменения.

Вы можете сохранить значки под своим именем, например, cat.png. В этом случае вам надо открыть файл манифеста, найти там строчку:

<application 
   android:icon="@drawable/icon" 
   ...

И отредактировать ее, например, android:icon="@drawable/cat" (без расширения). Как вариант, вы можете сохранить один значок в папке drawable в нужном размере, если пишете программу под определенные типы телефонов.

Размеры значков в папках:

  • Low density – ldpi – 36×36 px
  • Medium density – mdpi – 48×48 px
  • High density – hdpi – 72×72 px

Получить номер версии программы

В манифесте AndroidManifest.xml имеются два атрибута android:versionCode и android:versionName, которые указывают на номер версии программы.

Вы можете программно получить номера этих версий через класс PackageManager. Создадим две функции для извлечения номеров версии.


private String getVersionName() {

	String versionName = "";
	try {
		versionName = getPackageManager().getPackageInfo(getPackageName(),
				0).versionName;
	} catch (NameNotFoundException e) {
		// Какая-то ошибка
	}
	return versionName;
}

private int getVersionCode() {
	int ver = 0;
	try {
		ver = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
	} catch (NameNotFoundException e) {
		// Какая-то ошибка
	}
	return ver;
}

Обратите внимание, что нужно обязательно использовать конструкциию try/catch - без них компилятор не позволяет запустить программу. Теперь осталось вызвать функции, например, при нажатии кнопки.


textVersion.setText("Номер версии: " + getVersionCode());
// или
textVersion.setText("Номер версии: " + getVersionName());

Убить приложение

Убить приложение можно несколькими способами:


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

System.exit(0);

finish(); // метод класса Activity

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

'

Сколько используется памяти

Нужно от общей памяти отнять свободную память


// Get the Java runtime
Runtime runtime = Runtime.getRuntime();
// Run the garbage collector
runtime.gc();
// Calculate the used memory
long memoryUsed = runtime.totalMemory() - runtime.freeMemory();
textView1.setText(String.valueOf(memoryUsed));

Как заполнить фон повторяющимся изображением (черепицей)

У многих элементов есть атрибут android:background, задать значение которого можно различными способами, в том числе указанием XML-ресурса, в котором описан способ заполнения заднего фона. Нам понадобятся само изображение, которым будет заполняться фон и XML-описание с указанием, как использовать это изображение при заполнении фона.

Исходное изображение pyramid.png (@drawable/pyramid)

XML-описание (@drawable/pyramidbitmap (pyramidbitmap.xml))


<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/pyramid"
    android:tileMode="repeat" />

Атрибут android:tileMode задает тип заполнения, в данном случае повторение исходного изображения по двум направлениям X- и Y- координат (repeat), указанного в атрибуте android:src.

Далее задается в качестве заднего фона (атрибут android:background) этот XML-файл. Для демонстрации выбран LinearLayout.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/pyramidbitmap"
    android:orientation="vertical" >

В режиме Graphical Layout у меня редактор заругался, что не может отпарсить строку. Но это не мешает запустить программу и получить следующий результат.

tileMode

Подглядел здесь.

Как сделать скриншот на эмуляторе

Если вам нужно сделать скриншот вашего приложения в эмуляторе, совсем не обязательно использовать PrintScreen и всякие программы, делающие снимки экрана. В Eclipse откройте меню Window | Show View | Other и в диалоговом окне выберите Devices (категория Android). У вас на экране появится новая панель Devices, на которой есть значок фотоаппарта. Щелкните на нем и получите снимок вашего приложения.

Меняем ориентацию экрана на эмуляторе

Для смены ориентации экрана на эмуляторе можно использовать комбинации клавиш Ctrl+F11.

Также можно использовать клавиши 7 или 9 на цифровой клавиатуре. Не работает? А вы клавишу Numlock отключите, и все заработает. (подсказал кот Рыжик)

Запретить автоматическую смену ориентации при повороте устройства

Если вы хотите запретить автоматическую смену ориентацию при повороте устройства, то можно ее отключить для нужного экрана. Например, если экран с настройками должен отображаться только в портретном режиме, то добавьте одну строчку с атрибутом screenOrientation в манифест файла для соответствующей активности


<activity android:name=".MyActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait">

Показать список недавно запущенных программ

Если долго держать нажатой кнопку с изображением домика, то появится список недавно запущенных программ (работает и на эмуляторе).

Может ли ваше устройство работать с PDF-файлами


public boolean canReadPdf(Context c) {
	PackageManager pm = c.getPackageManager();
	Intent data = new Intent(Intent.ACTION_VIEW);
	// устанавливаем MIME-тип
	data.setType("application/pdf");
	// если имеется программа для работы с PDF
	if(pm.queryIntentActivities(data, PackageManager.MATCH_DEFAULT_ONLY).size() > 0) {
		return true;
	}
	// not found any
	return false;
}