TelephonyManager


package amurdroid.myapp17092;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity  {



    MediaPlayer mPlayer;
    Button startButton, pauseButton, stopButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        mPlayer=MediaPlayer.create(this, R.raw.ase);
        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                stop();
            }
        });
        startButton = (Button) findViewById(R.id.start);
        pauseButton = (Button) findViewById(R.id.pause);
        stopButton = (Button) findViewById(R.id.stop);

        pauseButton.setEnabled(false);
        stopButton.setEnabled(false);
        PhoneStateListener phoneStateListener = new PhoneStateListener() {
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                if (state == TelephonyManager.CALL_STATE_RINGING) {

                    if(mPlayer!=null){//check mp


                        if(mPlayer.isPlaying()){

                            mPlayer.pause();
                        }
                    }

                } else if(state == TelephonyManager.CALL_STATE_IDLE) {
                    mPlayer.start();

                } else if(state == TelephonyManager.CALL_STATE_OFFHOOK) {

                    if(mPlayer!=null){//check mp


                        if(mPlayer.isPlaying()){

                            mPlayer.pause();
                        }
                    }
                }
                super.onCallStateChanged(state, incomingNumber);
            }
        };//end PhoneStateListener

        TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        if(mgr != null) {
            mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
        }
    }



    private void stop(){
        mPlayer.stop();
        pauseButton.setEnabled(false);
        stopButton.setEnabled(false);
        try {
            mPlayer.prepare();
            mPlayer.seekTo(0);
            startButton.setEnabled(true);
        }
        catch (Throwable t) {
            Toast.makeText(this, t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
    public void startAudio(View view){

        mPlayer.start();
        startButton.setEnabled(false);
        pauseButton.setEnabled(true);
        stopButton.setEnabled(true);
    }

    public void pauseAudio(View view){

        mPlayer.pause();
        startButton.setEnabled(true);
        pauseButton.setEnabled(false);
        stopButton.setEnabled(true);
    }

    public void stopAudio(View view){

        stop();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (stopButton.isEnabled()) {
            stop();
        }
    }
}

ScrollView

Если ваш макет экрана достаточно большой и все его элементы не помещаются на экране по вертикали, то самое подходящее — использовать контейнер ScrollView, внутрь которого вы можете поместить нужный layout с дочерними элементами. При этом просмотреть все имеющиеся элементы позволит полоса прокрутки.

Как сказано в документации, ScrollView — это FrameLayout, а это значит, что он может содержать только один дочерний элемент. Обычно этим элементом является какой-то LinearLayout с вертикальной ориентацией, который содержит все остальные элементы экрана.
Важно отметить, что для элементов ListView вам не нужно создавать прокрутку, т.к. здесь она появляется автоматически при необходимости.

Используем для текста HTML оформление

Используем для текста HTML оформление
Главная » Используем для текста HTML оформление
В этом кратком уроке мы научимся делать вот такую полезную штуку - использовать для любого текстового элемента TextView в нашем приложении заданный с помощью HTML вид. Это может пригодиться для того, чтобы не настраивать каждый раз новый текстовый элемент с нуля, а просто применить к нему готовый стиль. Также этот прием понравиться знатока HTML, которым проще работать именно с этим кодом.

Создаем новый проект с Blank Activity. Первым делом в файле activity_main.xml создадим текстовый элемент для экспериментов:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/tv"
 android:text="Пример текста"/>
</LinearLayout>
Теперь откроем файл, хранящий строковые ресурсы - strings.xml. Именно здесь мы и создадим необходимый нам шаблон текста с помощью HTML:
<string name="info"><![CDATA[
 <font color="#4713f2"><b><i>HTML</b></font> - язык гипертекстовой разметки
 </i><br></br>]]>
 </string>
Как видите, мы создали довольно экзотическую для Android программирования строку с помощью вот такой команды:
<![CDATA[ помещаем сюда html-код ]]>
Внутри этой строки пишем необходимый HTML код без каких либо изменений и он отобразиться как нужно.
Осталось нужным образом отредактировать MainActivity.java:
import android.app.Activity;
import android.os.Bundle;
import android.text.Html;
import android.widget.TextView;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 //Объявляем объект TextView и привязываем к нашему элементу:
 TextView Htext = (TextView) findViewById(R.id.tv);
 
 //Создаем строковый ресурс и задаем ему значение с нашей строки "example":
 String infoText = getResources().getString(R.string.example);
 
 //Настраиваем строке HTML текст:
 Htext.setText(Html.fromHtml(infoText));
 }
}
Вот и все! Запускаем приложение и смотрим на результат:
Текст с HTML

Добавляем в приложение диаграммы с помощью MPAndroidChart

Если ваше приложение работает с большими объемами информации, то может возникнуть нужда в их приятном представлении. Для этого можно использовать разные методы: таблицы, графики, диаграммы. Сегодня мы научимся, как добавлять в Android приложение диаграммы, используя библиотеку MPAndroidChart. Диаграммы этой библиотеки удобны, легки в настройке и даже интерактивны. 
Для того, чтобы использовать библиотеку MPAndroidChart для начала ее нужно скачать вот отсюда, а потом скопировать файл библиотеки в папку libs вашего проекта, нажать в Android Studio правым кликом мышки по файлу JAR библиотеки и выбрать Add as Library и подождать пока все добавится.

Интересное про андроид

В наше время операционная система Android у нас на глазах выбивается в лидирующую ОС для мобильных устройств по всему миру. Конечно, у нее есть достойные конкуренты, в основном Apple, но учитывая доступность устройств на Android по сравнению с iPhone, можно предположить что в скором времени Android одолеет противника. 

Поиск в ListView

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

живые обои

В этом уроке мы научимся создавать живые обои для Android устройства, используя для этого обычную gif анимацию. Конечно, есть и другой способ создания живых обоев, с использованием собственных изображений, математических подсчетов и собственноручно созданной анимации, и его мы как нибудь тоже рассмотрим, но это занимает много сил, времени и требует от создателя творческого мышления, попробуй ка выдумай что нибудь толковое. Но мы пойдем намного более легким путем и сделаем собственные живые обои из обыкновенной gif анимации.
Начнем с того, что подготовим анимацию для наших живых обоев. Конечно, вы можете найти любую анимацию которая вам понравится и использовать ее, но если вам день это делать - качайте эту
Создаем новый проект, все названия файлов можете оставлять по умолчанию, можете вводить свои, как вам удобно. Минимальную версию Android выберем 2.2 Froyo, а при выборе activity выбираем Add No Activity и жмем финиш. 

Стороние шрифты

Давайте немного расширим наши знания в работе с текстом при создании Android приложения. Мы изучали способ отредактировать текст с помощью любимой и знакомой многим HTML верстки. Но в этом уроке мы применим к тексту самые настоящие шрифты, как это делается, например, в фотошоп. 
Прежде всего, для того, чтоб использовать шрифты, их неплохо бы скачать:). Поэтому скачайте с Интернета несколько разных шрифтов (я буду использовать в уроке 3 вот таких, можете скачать их). 

Текст с разметкой в android.widget.TextView tutorial

Текст с разметкой в android.widget.TextView tutorial

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

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

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

Я реализовал весь, необходимый мне функционал и выяснил ещё несколько довольно интересных вещей, столкнувшись с некоторым количеством подводных камней (впрочем, не очень острых). Можно сказать, всё нижеописанное — руководство по созданию достаточно мощной справочной системы в своём приложении практически даром.

Сохранение настроек.Климов

Сохраняем настройки

Введение

Девочка встретила котёнка
Очень часто требуется сохранить какие-то настройки. Простой пример - девочка с удовольствим пользовалась нашей программой Счётчик ворон и вертела головой в поисках очередной птицы. Но вот незадача - когда девочка вечером закрывала своё приложение, то на следующий день счётчик обнулялся. А так хотелось узнать, сколько ворон можно насчитать за месяц. Но однажды в дождливый осенний день она встретила рыжее чудо. Впрочем, это уже совсем другая история.
Самый простой способ, который приходит в голову - сбросить данные в файл, а при запуске приложения считывать необходимые данные из файла. Второй вариант - работать с базой данных и хранить настройки там.
Рассмотрим сначала второй вариант. Хранить данные в базе данных не всегда оправдано, если данных не слишком много, они простые и нам не нужно анализировать данные на предмет, сколько мышек поймал котик в прошлом году и сколько часов он спал в январе и феврале.
Первый вариант с файлами хорош, например, для сохранения больших текстовых заметок. Естественно, и для простых данных мы тоже можем использовать файлы. Записали что-то в файл, а потом открыли его и считали данные.
На самом деле нет необходимости изобретать свой велосипед и придумывать свою структуру для хранения данных. В Android существует класс SharedPreferences (Общие настройки), разработанный специально для этих целей. Приложение автоматически создаёт файл в своей папке и хранит простые данные в виде «ключ — значение». Весь процесс создания, открытия, чтения файла оптимизирован и избавляет вас от головной боли.
Общие настройки поддерживают базовые типы boolean, string, float, long и integer, что делает их идеальным средством для быстрого сохранения значений по умолчанию, переменных экземпляра класса, текущего состояния UI и пользовательских настроек. Они чаще всего используются для обеспечения постоянства данных между пользовательскими сессиями и доступа к ним компонентов приложения.

Сохранение значений параметров

Если у вас сохранился старый проект по подсчёту ворон, то можете снова его открыть и добавить новый код. Либо заново создайте проект по памяти, заодно проверите, как усвоили урок и сможете ли вы самостоятельно создать проект с нуля, не заглядывая на сайт за подсказкой.
Для удобства создадим константу для имени файла настроек, например:

// это будет именем файла настроек
public static final String APP_PREFERENCES = "mysettings"; 
Создадим параметр, который мы хотим сохранять в настройках. Нас интересуют показания счётчика.

public static final String APP_PREFERENCES_COUNTER = "counter";
Создаём переменную, представляющую экземпляр класса SharedPreferences, который отвечает за работу с настройками:

private SharedPreferences mSettings;
Внутри метода onCreate() вы инициализируете эту переменную::

mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
Вы передаёте в указанный метод getSharedPreferences() название вашего файла (он будет создан автоматически) и стандартное разрешение, дающее доступ только компонентам приложения.
Немного опередим события и представим, что приложение запущено и мы считаем ворон весь день. Когда мы закрываем приложение, то нам необходимо сохранить информацию в Общих настройках. Обычно для этих целей используют методы onPaused() или onStop().
Чтобы внести изменения в настройки, нужно использовать класс SharedPreferences.Editor. Получить объект Editor можно через вызов метода edit() объекта SharedPreferences. После того, как вы внесли все необходимые изменения, вызовите метод apply(), чтобы изменения вступили в силу.

@Override
protected void onPause() {
    super.onPause();
    // Запоминаем данные
    SharedPreferences.Editor editor = mSettings.edit();
    editor.putInt(APP_PREFERENCES_COUNTER, mCounter);
    editor.apply();
}
Теперь при закрытии программы значение счётчика автоматически запишется в файл. При повторном запуске приложения нам уже не нужно инициализировать счётчик со значением 0. Мы можем прочитать сохранённое значение и использовать его для счётчика, чтобы продолжить подсчёт. Сделаем это в методе onResume().

@Override
protected void onResume() {
    super.onResume();

    if (mSettings.contains(APP_PREFERENCES_COUNTER)) {
        // Получаем число из настроек
        mCounter = mSettings.getInt(APP_PREFERENCES_COUNTER, 0);
        // Выводим на экран данные из настроек
        mInfoTextView.setText("Я насчитал "
                + mCounter + " ворон");
    }
}
Мы проверяем сначала наличие ключа APP_PREFERENCES_COUNTER, а затем извлекаем из ключа его значение.
Вот и всё. Небольшие изменения в коде сделали программу продвинутой. Теперь вы можете спокойно закрывать и открывать программу, ваши данные не будут потеряны. При желании вы можете добавить кнопку для сброса счётчика. Это вам в качестве домашнего задания.
В теории показаны дополнительные примеры и даны подробные сведения об использовании Общих настроек. Вам следует хорошенько разобраться в этом механизме, так как он часто используется на практике. Более того, некоторые программисты предпочитают использовать Общие настройки вместо базы данных, если это позволяет логика программы, так как это работает быстрее и потребляет меньше ресурсов. Выбор за вами.

Вместо послесловия

Не волнуйтесь, с котёнком всё в порядке. Девочка подобрала его и принесла домой. И добрая девочка по-прежнему пользуется нашей программой "Счётчик ворон". Наверное, биологом станет или ветеринаром.

При написании статьи использовались иллюстрации Рины З..
Показать код (щелкните мышкой) Разметка

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

    <Button
        android:id="@+id/buttonCrowsCounter"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="Считаем ворон" />

    <TextView
        android:id="@+id/textViewInfo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="" />

</LinearLayout>
Код класса активности

package ru.alexanderklimov.testapplication;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

    private int mCounter;
    private TextView mInfoTextView;

    // имя файла настройки
    public static final String APP_PREFERENCES = "mysettings";
    public static final String APP_PREFERENCES_COUNTER = "counter";
    private SharedPreferences mSettings;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
        mInfoTextView = (TextView) findViewById(R.id.textViewInfo);
    }

    public void onClick(View v) {
        // Выводим на экран
        mInfoTextView.setText("Я насчитал " + ++mCounter + " ворон");
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (mSettings.contains(APP_PREFERENCES_COUNTER)) {
            // Получаем число из настроек
            mCounter = mSettings.getInt(APP_PREFERENCES_COUNTER, 0);
            // Выводим на экран данные из настроек
            mInfoTextView.setText("Я насчитал "
                    + mCounter + " ворон");
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        // Запоминаем данные
        SharedPreferences.Editor editor = mSettings.edit();
        editor.putInt(APP_PREFERENCES_COUNTER, mCounter);
        editor.apply();
    }
}

 

 

SharedPreferences

Введение
Сохранение значений параметров
Чтение значений параметров
Методы getStringSet() и putStringSet()
Сохранение настроек на SD-карту
Импорт системных настроек
Настройки с зависимостями
Отслеживание изменений в Общих настройках
Я у тебя первый?
Запомнить пользователя
Запомнить состояние переключателей
getDefaultSharedPreferences()

Чтобы получить экземпляр класса SharedPreferences для получения доступа к настройкам в коде приложения используются три метода:
  • getPreferences() — внутри активности, чтобы обратиться к определенному для активности предпочтению;
  • getSharedPreferences() — внутри активности, чтобы обратиться к предпочтению на уровне приложения;
  • getDefaultSharedPreferences() — из объекта PreferencesManager, чтобы получить общедоступную настройку, предоставляемую Android.

Видео про монетизацию приложения



собеседование Андроид

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

Android Swipe Views with Tabs

Android Swipe Views with Tabs

In this post we are going to learn about how to integrate the android tab view with the fragments using ViewPager and ActionBar class. For displaying the tabs on the top of the screen you need to interact with the android action bar, this is because the tab views is connected with the action bar.
In this example application we make three tabs called "java", "php" and ".Net" and there are three seperate fragement view for each of these tabs.

настройки

Настройки в Android-приложениях перевод

Интересуюсь темой разработки под Android. Пишу небольшое приложение. Столкнулся с тем, что не до конца понимаю как правильно делать настройки для приложения. Немного погуглил, нашел статью, которая помогла разобраться. Решил перевести статью для русскоязычного сообщества, включив некоторые комментарии к оригиналу.

Настройки являются важной частью приложений на Android (и не только на Android — здесь и далее примечание переводчика). Это очень важно — позволять пользователям изменять настройки приложения, в зависимости от их предпочтений.

Существует два пути работы с настройками в Android — можно создать файл preferences.xml в директории res/xml, либо работать с настройками из кода. В данной статье я покажу как работать с настройками, используя preferences.xml файл.


Создание бит Бокс приложения.запись.

видео где создается бит бокс приложение с функцией записи



настройка Андроид Студио

При первоначальной установки Андроид Студио в настройках по умолчании отключено много полезных и нужных функций.
Лично для себя определил несколько, которые и представляю ниже:

сплаш картинка

пишем некий код ниже


package com.example.kekedroid.myappsplh;

import android.content.Intent;
import android.content.res.Configuration;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class Splash extends AppCompatActivity {
    private static int SPLASH_SCREEN_TIMEOUT = 2500;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(Splash.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        }, SPLASH_SCREEN_TIMEOUT);


    }

}
и следующий код


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.kekedroid.myappsplh.Splash"
    android:id="@+id/line1">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        android:src="@drawable/img1"
        android:layout_gravity="center_horizontal" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="www.kekedroid.ru"
        android:id="@+id/textView"
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal" />

</LinearLayout>
и следующий

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.kekedroid.myappsplh" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:configChanges="orientation">

        </activity>
        <activity
            android:name=".Splash"
            android:label="@string/title_activity_splash"
            android:screenOrientation="portrait"

            android:configChanges="orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>
    </application>

</manifest>