Собственный Код Android И Ios В Qt На Примере Строки Состояния

Привет! Я уверен, что многие слышали, что Qt очень хорош для кроссплатформенной разработки мобильных приложений.

Однако для решения некоторых задач приходится иметь дело с нативным кодом (Java, Objective-C), например вызов камеры, галереи, вызов стороннего API. В этой статье на простом примере настройки прозрачности строки состояния я покажу, как вызывать нативный код Java и Objective-C.

Собственный код Android и iOS в Qt на примере строки состояния



Андроид

Возможность использовать прозрачную строку состояния появилась в Андроид 4.4 КитКат .

Чтобы строка состояния стала прозрачной, необходимо Активность нашего проекта, укажите флаг прозрачности для Окно (не путать с QQuickWindow , который используется для отображения QML).

Если кто-то не знает, как переопределить свою активность из QtActivity. Откройте вкладку «Проекты» → «Добавить сборку для Android» → «Сборка» → нажмите «Подробнее» в «Сборка Android APK» → «Создать шаблоны».

Таким образом, мы создали AndroidManifest — папку с ресурсами и файлами градиентов, которая будет находиться в папке android. Чтобы разместить наш Java-класс, давайте создадим папку src в папке Android. Давайте создадим файл Моя активность.

java .

Важно, чтобы путь к файлу совпадал с именем пакета, т.е.

использовался пакет с именем com.example.myPackage, должен быть способ android/src/com/example/myPackage/MyActivity.java

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

package com.example.myPackage; import org.qtproject.qt5.android.bindings.QtActivity; import android.app.Activity; import android.os.Bundle; public class MyActivity extends QtActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }

Теперь нам нужно установить имя действия в AndroidManifest.xml .

Ищем

android:name="com.example.myPackage.MyActivity"

и изменить на

android:name="org.qtproject.qt5.android.bindings.QtActivity"

С помощью этих простых манипуляций мы переопределили стандарт QtActivity. Функция, устанавливающая флаг прозрачности строки состояния и пример ее использования:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTranparentStatusBar(); } void function setTranparentStatusBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().

addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); getWindow().

getDecorView().

setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); getWindow().

setStatusBarColor(Color.TRANSPARENT); } else { getWindow().

setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } }

Функция, возвращающая высоту строки состояния:

public int statusBarHeight() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return 0; } int result = 0; int resourceId = getResources().

getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().

getDimensionPixelSize(resourceId); } return result; }

Чтобы вызвать метод класса Java из QML, вам нужно написать класс C++, который будет использовать JNI .

Для работы с JNI добавим его в наш *.

pro файл модуль Андроид:

QT += androidextras.

Давайте создадим синглтон класс DeviceInfo. DeviceInfo.h:

#pragma once #include <QObject> class DeviceInfo : public QObject { Q_OBJECT Q_PROPERTY(int statusBarHeight READ statusBarHeight) public: DeviceInfo(QObject *parent = NULL); static DeviceInfo &instance(QObject *parent = 0); Q_INVOKABLE int statusBarHeight(); private: static DeviceInfo _instance; };

DeviceInfo.cpp:

#include "DeviceInfo.h" #if defined(Q_OS_ANDROID) #include <QAndroidJniObject> #include <QtAndroidExtras> #include <QtAndroid> #endif DeviceInfo::DeviceInfo(QObject *parent) : QObject(parent) {} DeviceInfo &DeviceInfo::instance(QObject *parent) { static DeviceInfo instance(parent); return instance; } int DeviceInfo::statusBarHeight() { #if defined (Q_OS_ANDROID) QAndroidJniObject activity = QtAndroid::androidActivity(); jint height = activity.callMethod<jint>("statusBarHeight"); return (int) height; #endif return 0; }

Далее давайте определим наш класс в QML:

view.rootContext()->setContextProperty("DeviceInfo", &DeviceInfo::instance());

Все готово, осталось только вызвать метод статусБарХайт в КМЛ:

Rectangle { width: parent.width height: DeviceInfo.statusBarHeight() }

Краткое описание на экране:

Собственный код Android и iOS в Qt на примере строки состояния



iOS

Возможность задавать разные стили статус-бара в iOS появилась в iOS 7.0 .

Чтобы строка состояния в нашем приложении была прозрачной, нам нужно сделать 3 вещи:

  1. Изменить info.plist, а именно поменять ключ UIViewControllerBasedStatusBarAppearance :


<key>UIViewControllerBasedStatusBarAppearance</key> <false/>

  1. Для отображения QQuickView или QQuickWindow используйте метод showFullScreen() вместо show().

  1. Установить в строку состояния стиль UIStatusBarStyleLightContent
Если с первыми двумя пунктами все понятно, то рассмотрим третий подробнее.

Вы можете изменить стиль строки состояния, используя следующий метод в Objective-C:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

Функция, возвращающая высоту строки состояния:

[UIApplication sharedApplication].

statusBarFrame.size.height

Чтобы код Objective-C работал в классе DeviceInfo, нам нужно изменить исходное разрешение с .

cpp на .

mm. Поэтому в файле .

pro сделаем следующее:

HEADERS += \ Include/DeviceInfo.h !ios { SOURCES += \ Source/DeviceInfo.cpp } ios { OBJECTIVE_SOURCES += \ Source/DeviceInfo.mm }

DeviceInfo.mm:

#include "DeviceInfo.h" #import <UIKit/UIKit.h> DeviceInfo::DeviceInfo(QObject *parent) : QObject(parent) { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } DeviceInfo &DeviceInfo::instance(QObject *parent) { static DeviceInfo instance(parent); return instance; } int DeviceInfo::statusBarHeight() { return [UIApplication sharedApplication].

statusBarFrame.size.height; }

Краткое описание на экране:

Собственный код Android и iOS в Qt на примере строки состояния



Заключение

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

Пример исходного кода см.

GitHub .

Теги: #Qt #Android #java #iOS #objective-c #разработка мобильных устройств #Разработка мобильных приложений #Qt


Привет! Я уверен, что многие слышали, что Qt очень хорош для кроссплатформенной разработки мобильных приложений.

Однако для решения некоторых задач приходится иметь дело с нативным кодом (Java, Objective-C), например вызов камеры, галереи, вызов стороннего API. В этой статье на простом примере настройки прозрачности строки состояния я покажу, как вызывать нативный код Java и Objective-C.

Собственный код Android и iOS в Qt на примере строки состояния



Андроид

Возможность использовать прозрачную строку состояния появилась в Андроид 4.4 КитКат .

Чтобы строка состояния стала прозрачной, необходимо Активность нашего проекта, укажите флаг прозрачности для Окно (не путать с QQuickWindow , который используется для отображения QML).

Если кто-то не знает, как переопределить свою активность из QtActivity. Откройте вкладку «Проекты» → «Добавить сборку для Android» → «Сборка» → нажмите «Подробнее» в «Сборка Android APK» → «Создать шаблоны».

Таким образом, мы создали AndroidManifest — папку с ресурсами и файлами градиентов, которая будет находиться в папке android. Чтобы разместить наш Java-класс, давайте создадим папку src в папке Android. Давайте создадим файл Моя активность.

java .

Важно, чтобы путь к файлу совпадал с именем пакета, т.е.

использовался пакет с именем com.example.myPackage, должен быть способ android/src/com/example/myPackage/MyActivity.java

package com.example.myPackage; import org.qtproject.qt5.android.bindings.QtActivity; import android.app.Activity; import android.os.Bundle; public class MyActivity extends QtActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }

Теперь нам нужно установить имя действия в AndroidManifest.xml .

Ищем

android:name="com.example.myPackage.MyActivity"

и изменить на

android:name="org.qtproject.qt5.android.bindings.QtActivity"

С помощью этих простых манипуляций мы переопределили стандартную QtActivity. Функция, устанавливающая флаг прозрачности строки состояния и пример ее использования:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTranparentStatusBar(); } void function setTranparentStatusBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().

addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); getWindow().

getDecorView().

setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); getWindow().

setStatusBarColor(Color.TRANSPARENT); } else { getWindow().

setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } }

Функция, возвращающая высоту строки состояния:

public int statusBarHeight() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return 0; } int result = 0; int resourceId = getResources().

getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().

getDimensionPixelSize(resourceId); } return result; }

Чтобы вызвать метод класса Java из QML, вам нужно написать класс C++, который будет использовать JNI .

Для работы с JNI добавим его в наш *.

pro файл модуль Андроид:

QT += androidextras.

Давайте создадим синглтон класс DeviceInfo. DeviceInfo.h:

#pragma once #include <QObject> class DeviceInfo : public QObject { Q_OBJECT Q_PROPERTY(int statusBarHeight READ statusBarHeight) public: DeviceInfo(QObject *parent = NULL); static DeviceInfo &instance(QObject *parent = 0); Q_INVOKABLE int statusBarHeight(); private: static DeviceInfo _instance; };

DeviceInfo.cpp:

#include "DeviceInfo.h" #if defined(Q_OS_ANDROID) #include <QAndroidJniObject> #include <QtAndroidExtras> #include <QtAndroid> #endif DeviceInfo::DeviceInfo(QObject *parent) : QObject(parent) {} DeviceInfo &DeviceInfo::instance(QObject *parent) { static DeviceInfo instance(parent); return instance; } int DeviceInfo::statusBarHeight() { #if defined (Q_OS_ANDROID) QAndroidJniObject activity = QtAndroid::androidActivity(); jint height = activity.callMethod<jint>("statusBarHeight"); return (int) height; #endif return 0; }

Далее давайте определим наш класс в QML:

view.rootContext()->setContextProperty("DeviceInfo", &DeviceInfo::instance());

Все готово, осталось только вызвать метод статусБарХайт в КМЛ:

Rectangle { width: parent.width height: DeviceInfo.statusBarHeight() }

Краткое описание на экране:

Собственный код Android и iOS в Qt на примере строки состояния



iOS

Возможность задавать разные стили статус-бара в iOS появилась в iOS 7.0 .

Чтобы строка состояния в нашем приложении была прозрачной, нам нужно сделать 3 вещи:

  1. Изменить info.plist, а именно поменять ключ UIViewControllerBasedStatusBarAppearance :


<key>UIViewControllerBasedStatusBarAppearance</key> <false/>

  1. Для отображения QQuickView или QQuickWindow используйте метод showFullScreen() вместо show().

  1. Установить в строку состояния стиль UIStatusBarStyleLightContent
Если с первыми двумя пунктами все понятно, то рассмотрим третий подробнее.

Вы можете изменить стиль строки состояния, используя следующий метод в Objective-C:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

Функция, возвращающая высоту строки состояния:

[UIApplication sharedApplication].

statusBarFrame.size.height

Чтобы код Objective-C работал в классе DeviceInfo, нам нужно изменить исходное разрешение с .

cpp на .

mm. Поэтому в файле .

pro сделаем следующее:

HEADERS += \ Include/DeviceInfo.h !ios { SOURCES += \ Source/DeviceInfo.cpp } ios { OBJECTIVE_SOURCES += \ Source/DeviceInfo.mm }

DeviceInfo.mm:

#include "DeviceInfo.h" #import <UIKit/UIKit.h> DeviceInfo::DeviceInfo(QObject *parent) : QObject(parent) { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } DeviceInfo &DeviceInfo::instance(QObject *parent) { static DeviceInfo instance(parent); return instance; } int DeviceInfo::statusBarHeight() { return [UIApplication sharedApplication].

statusBarFrame.size.height; }

Краткое описание на экране:

Собственный код Android и iOS в Qt на примере строки состояния



Заключение

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

Пример исходного кода см.

GitHub .

Теги: #Qt #Android #java #iOS #objective-c #разработка мобильных устройств #Разработка мобильных приложений #Qt

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.