Важно (9.07.22)

Если картинки в постах не отображаются, зайдите в блог через прокси. РКН заблокировал поддомены blogger.com на которые загружались картинки.

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);»