JNI Code Snippet

Здесь будут фрагменты кода, написанные с использованием JNI(Android API). Вы можете добавить свой код, решающий какой-то вопрос в комментарии и я перенесу ваше решение на страницу.

Определяем текущее значение громкости
uses
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Media,
  Androidapi.Helpers,
  Androidapi.JNI.App,
  Androidapi.JNIBridge;

procedure TForm1.Button1Click(Sender: TObject);
var
  AudioObj: JObject;
  Audio: JAudioManager;
  CurrentVolume: Integer;
begin
  AudioObj = SharedActivity.getSystemService(TJActivity.JavaClass.AUDIO_SERVICE);
  Audio := TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID);
  CurrentVolume = Audio.getStreamVolume(TJAudioManager.JavaClass.STREAM_MUSIC);
end;

Вызов домашнего экрана
uses
  Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers;

procedure TForm2.Button1Click(Sender: TObject);
var
  Intent: JIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_MAIN);
  Intent.addCategory(TJIntent.JavaClass.CATEGORY_HOME);
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  SharedActivity.startActivity(Intent);
end;

Как программно изменять вид окна приложения (скрыть статус бар) в XE6?

Получаем список датчиков(Sensors) и информацию о них

Получаем список SMS-сообщений

Используем Wi-Fi

Как получить список вызовов?

Как определить тип контакта/аккаунта и тип номера?

Как получить список контактов (Имена и номера)?

Как получить версию приложения(versionName) в run-time, указанную в окне "Project->Options->Version Info"?
{for Delphi XE6: Add to "uses" module "Androidapi.Helpers"}
uses
  Androidapi.JNI.JavaTypes, FMX.Helpers.Android,
  Androidapi.JNI.GraphicsContentViewText;

var
  PackageManager: JPackageManager;
  VersionPackage,PackageName: JString;
begin
  PackageManager := SharedActivity.getPackageManager;
  PackageName := SharedActivityContext.getPackageName;
  
  VersionPackage := PackageManager.getPackageInfo(PackageName, 0).versionName;
  Label1.Text := JStringToString(VersionPackage);


Как получить IMEI \ MEID \ ESN код устройства?
// Uses Permission: Read phone state = true
{for Delphi XE6: Add to "uses" module "Androidapi.Helpers"}
uses
  FMX.Helpers.Android, Androidapi.JNI.JavaTypes,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Telephony, Androidapi.JNIBridge;

var
  TelephonyObj: JObject;
  TelephonyManager: JTelephonyManager;
begin
  TelephonyObj := SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE);
  TelephonyManager := TJTelephonyManager.Wrap((TelephonyObj as ILocalObject).GetObjectID);
  Label1.Text := JStringToString(TelephonyManager.getDeviceId);

Как закрыть приложение?
uses
  FMX.Platform.Android;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  MainActivity.finish;
end;

Как использовать вибрацию?
uses
  FMX.Helpers.Android, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os,
  Androidapi.JNI.App, Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText;
 
function IntArrayToJArray(const OrigArray: array of integer): TJavaArray;
var
  i: integer;
begin
  Result := TJavaArray.Create(Length(OrigArray));
  for i := Low(OrigArray) to High(OrigArray) do
    Result.Items[i] := OrigArray[i];
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  VibratorObj: JObject;
  Vibrator: JVibrator;
begin
  VibratorObj := SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_SERVICE);
  Vibrator := TJVibrator.Wrap((VibratorObj as ILocalObject).GetObjectID);
  
    Vibrator.vibrate(StrToInt(ClearingEdit1.Text));
  //or
  //Vibrator.vibrate(IntArrayToJArray([1000, 5000, 3000, 1000]), -1);
  //or
  //Vibrator.cancel();
  //or
  //if Vibrator.hasVibrator() then 
  //... 
  //else 
  //...
end;

Как определить Mime-type по расширению?
{for Delphi XE6: Add to "uses" module "Androidapi.Helpers"}
uses
  Androidapi.JNI.JavaTypes, Androidapi.JNI.Webkit;
 
var
  ExtFile: string;
  mime: JMimeTypeMap;
  ExtToMime: JString;
begin
  //Определяем расширение файла и его mime тип
  ExtFile := AnsiLowerCase(StringReplace(TPath.GetExtension(path), '.', '',[]));
  mime := TJMimeTypeMap.JavaClass.getSingleton();
  ExtToMime := mime.getMimeTypeFromExtension(StringToJString(ExtFile));

Как отправить запрос на открытие файла (Intent)?
{for Delphi XE6: Replace "Androidapi.JNI.JavaTypes" on "Androidapi.Helpers"}
uses
  Androidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android, Androidapi.JNI.JavaTypes;

var
  Intent: JIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setDataAndType(StrToJURI('file:' + 'Путь'), 'Здесь указываем Mime-type в JString');
  SharedActivity.startActivity(Intent);

Как получить полное имя ".apk" файла в директории "/data/app/"?
uses
  Androidapi.JNI.JavaTypes, FMX.Helpers.Android;

var
  PackageName: JString; 
begin
  PackageName := SharedActivityContext.getPackageResourcePath;
  //Чтобы перевести в обычную строку, пишем JStringToString(PackageName)

Как отключить автоблокировку экрана?
1) Открываем проект в Delphi XE5, далее в меню «Project->View Source», в IDE откроется файл «Project1.dpr».
2) Теперь в «uses», после «FMX.Forms,» или до «Unit1 in 'Unit1.pas' {Form1};»  добавляем  «FMX.Helpers.Android,  Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText,»
3) Далее сразу после/до «Application.Initialize;» вставляем такую строчку:
«SharedActivity.getWindow.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON);»

28 комментариев:

  1. А есть ли возможность работать с рекламой в приложениях через JNI?сколько искал не могу ничего внятного найти.

    ОтветитьУдалить
    Ответы
    1. Я пока вообще не задавался вопросом рекламы, как будет время/желание/аккаунт, обязательно посмотрю и отпишусь.
      Вообще было бы очень хорошо, если бы в Delphi была бы встроена поддержка рекламы от AdMob.
      Вот сторонний компонент (платный): http://www.flashavconverter.com/content/admob-android-delphi-component

      Удалить
    2. Сегодня стали известны планы по развитию продуктов от компании Embarcadero yf 2014 год. Один из пунктов «Advertising and Payments components for Android and iOS», т.е. в Delphi будут встроены возможности для работы с рекламой и платежами.

      Удалить
  2. а как можно сделать так что из приложения ответить на звонка?

    ОтветитьУдалить
    Ответы
    1. Вам необходимо прослушивать события, происходящие в ОС. Для этого используем BroadcastReceiver - http://developer.android.com/reference/android/content/BroadcastReceiver.html

      Удалить
    2. спасибо
      если вам не будет трудно напишите маленький пример как использовать BroadcastReceiver в Delphi ХЕ6
      Заранее спасибо

      Удалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
  4. Короче что не пробовал никак не получается ответить на звонка :((( может у кого есть пример? как это сделать? заранее спасибо

    ОтветитьУдалить
  5. Андрей а можете подсказать, как мне обратится к API запущенного приложения? Мне нужно получить продолжительность видео запущенного в МХ плеере.
    https://sites.google.com/site/mxvpen/api
    Вот апи, пробую так
    Label2.Text := IntToStr(Intent.getIntExtra(StringToJString('duration'), -2));
    Но получаю -2

    ОтветитьУдалить
    Ответы
    1. С помощью интента, только придётся, скорее всего, запилить это дело в Java-классе, который потом подключить к вашему проекту на FMX. Хотя можно попробовать и через Delphi/С++ получить эту инфу. Там есть пример обращения к АПИ (в самом низу, архив), посмотрите его.

      Удалить
    2. Этот комментарий был удален автором.

      Удалить
  6. Этот комментарий был удален автором.

    ОтветитьУдалить
  7. Здравствуйте.
    Подскажите, пожалуйста, как запретить закрытие приложения кнопками андроида, чтобы осталась возможность закрывать только из самого приложения?
    Как развернуть приложение, чтобы оно было полностью на весь экран, чтобы не было строки состояния?

    ОтветитьУдалить
    Ответы
    1. По первому вопросу, запретить закрывать приложение на всех кнопках невозможно, можно запретить использовать кнопку "Назад", для этого посмотрите блог внимательнее, есть страничка "Список всех сообщений"... Вам необходима вот эта тема "Работаем с кнопками на Android устройствах".
      По второму вопросу, опять же, посмотрите внимательно на страницу "JNI Code Snippet", вам будет интересна тема "Как программно изменять вид окна приложения (скрыть статус бар) в XE6?"

      Удалить
    2. Андрей, добрый день.
      Спасибо за ответ. С кнопкой "Назад" проблем нет, а вот с блокировкой всех остальных... Есть же приложения для детей, в котором они не могут его закрыть без пароля.

      Удалить
    3. Дайте пример такого приложения. Если такое и возможно, то мне это не известно, а значит надо искать информацию, например на стековерфлоу...

      Удалить
    4. в Google Play. Мир детей: песочница например. Под lollipop оно конечно не кое-что пропускает, но в 4 андроиде без пароля не выйдешь.

      Удалить
    5. Поставил. Без проблем выхожу из приложения нажимая на кнопку "Home", Андроид 4.4, пароль стоит, естественно выходить пытаюсь из режима "Мир Детей".

      Удалить
    6. У меня на планшете 4.2 видимо в новых версиях андроида это работает как-то по другому. Но даже в 5 андроиде если после Home что-то пытаться запускать, то иногда умудряется отловить и перекинуть обратно в приложение.

      Удалить
    7. Не знаю, но предполагаю, что приложение работает как сервис и постоянно прослушивает происходящие на устройстве события. Однако, это не объясняет того факта, что я без проблем вышел из него, запустил ещё кучу других приложений и даже смог удалить это приложение...

      Удалить
    8. Андрей, добрый день.
      Пишу вам на почту, в Hangouts, но нигде не отвечаете. Как с вами связаться? :)

      Удалить
    9. Возвращаясь к режиму киоск. Попробуйте выйти из приложения https://play.google.com/store/apps/details?id=com.gears42.surelock&hl=ru
      т.е. можно залочить так, что не выйти и не нужен рут.

      Удалить
  8. Этот комментарий был удален автором.

    ОтветитьУдалить
  9. Здравствуйте. А есть ли возможность определить текущее положение ползунка громкости?

    ОтветитьУдалить
    Ответы
    1. Ответил тут: http://fire-monkey.ru/topic/1313-opredelenie-polozhenie-polzunka-gromkosti/?p=6409

      Удалить
  10. приветствую всех. Есть вопрос. кто может подсказать или показать код на создание vpn подключения по кнопке... подключиться и отключения по соответствующей кнопке.. и что бы в телефоне не осталось настройки о vpn подключении.
    Спасибо заранее. если что то можно на почту скинуть маяк )))

    ОтветитьУдалить