h
Oct. 20, 2023, 2:11 a.m.

Контакты Android

c++, qt, android

Всем доброго времени суток. Пишу код на c++ с использованием qt6, в котором хотел вывести на экран данные из телефонной книги.
Столкнулся с тем, что совершенно не предсталяю как получить доступ к контактам, интернет тоже особо не помог.
До этого пробовал писать точно такую же программу, но на java и там все довольно просто, но вот сама java мне особо не нравится.
Есть ли какой-то способ получить контакты?

2
2
Виктор Калесников
  • Oct. 20, 2023, 2:45 a.m.
  • (edited)

У меня в моем мессенджере есть реализация. Завтра в рабочем ноуте посмотрю, скину сюда код.

    Виктор Калесников
    • Oct. 20, 2023, 2:29 p.m.
    • (edited)

    делал в далеком 2017г поэтому особенно ничего не подскажу. Это основные методы получения данных с андроида используя Qt.
    Там еще какоето колдунство с манифестом. Андроидом давно не занимаюсь, не помню подробностей. Андроид + qt дело крайне муторное.

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

    файл QtAdMobActivity.java

    import android.os.Bundle;
    import android.view.View;
    import android.view.Window;
    import android.view.ViewGroup;
    import android.util.Log;
    import android.graphics.Rect;
    import org.qtproject.qt5.android.bindings.QtActivity;
    import org.qtproject.qt5.android.bindings.QtApplication;
    import java.util.ArrayList;
    import android.widget.FrameLayout;

    import org.qtproject.qt5.android.bindings.QtActivity;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Build;
    import android.view.Window;
    import android.view.WindowManager;
    import android.view.View;
    import android.graphics.Color;
    import android.content.Context;
    //---------
    import android.content.ContentResolver;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.ContactsContract;

    import android.app.Notification;
    import android.app.NotificationManager;

    //---------------SDK23++
    import android.Manifest;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    //----------------SEND_SMS
    import android.app.Activity;
    import android.os.Bundle;
    import android.telephony.SmsManager;
    //----------------VOICE
    import android.media.AudioManager;
    //------------------

    public class QtAdMobActivity extends QtActivity
    {

    //---Notification
    private static NotificationManager m_notificationManager;
    private static Notification.Builder m_builder;
    private static QtAdMobActivity m_instance;

    1. public QtAdMobActivity()
    2. {
    3. System.out.println("QtAdMobActivity: initialize");
    4. m_instance = this;
    5. }

    public static void notify(String s)
    {
    if (m_notificationManager == null) {
    m_notificationManager = (NotificationManager)m_instance.getSystemService(Context.NOTIFICATION_SERVICE);
    m_builder = new Notification.Builder(m_instance);
    m_builder.setSmallIcon(R.drawable.icon);
    m_builder.setContentTitle("SOTA");
    }

    1. m_builder.setContentText(s);
    2. m_notificationManager.notify(1, m_builder.build());
    3. }

    //-----------getheightStatusBar and ContactAndroid
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    1. //m_instance = this;//notify
    2. //m_instance.notify("test");
    3.  
    4. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    5. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    6.  
    7. String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.INTERNET, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.SEND_SMS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.ACCESS_WIFI_STATE};
    8. boolean flag = false;
    9.  
    10. for (int i = 0; i < permissions.length; i++)
    11. {
    12. if (checkSelfPermission(permissions[i]) == PackageManager.PERMISSION_DENIED)
    13. {
    14. flag = true;
    15. break;
    16. }
    17. }
    18. if (flag)
    19. {
    20. requestPermissions(permissions, 1);
    21. }

    /*

    1. System.out.println("onCreate 1:");
    2. if (m_notificationManager == null) {
    3. System.out.println("onCreate 2:");
    4. m_notificationManager = (NotificationManager)m_instance.getSystemService(Context.NOTIFICATION_SERVICE);
    5. m_builder = new Notification.Builder(m_instance);
    6. m_builder.setSmallIcon(R.drawable.icon);
    7. m_builder.setContentTitle("SOTA");
    8. }
    9.  
    10. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
    11. && !m_notificationManager.isNotificationPolicyAccessGranted()) {
    12. System.out.println("onCreate 3:");
    13.  
    14. Intent intent = new Intent(
    15. android.provider.Settings
    16. .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
    17.  
    18. startActivity(intent);
    19. }
    20. //--------

    */

    1. //getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    2. //getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    3. //getWindow().setStatusBarColor(Color.TRANSPARENT);
    4. } else {
    5. //getWindow().setFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
    6. // , WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    7. }
    8. }
    9. }
    10.  
    11. public String getContacts() {
    12.  
    13. System.out.println("--------------getContacts----------------");
    14.  
    15. String phoneNumber = null;
    16. int countPhone = 0;
    17.  
    18.  
    19. Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI;
    20. String _ID = ContactsContract.Contacts._ID;
    21. String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
    22. String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER;
    23.  
    24. Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    25. String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
    26. String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
    27.  
    28. StringBuffer output = new StringBuffer();
    29. ContentResolver contentResolver = getContentResolver();
    30. Cursor cursor = contentResolver.query(CONTENT_URI, null,null, null, null);
    31.  
    32.  
    33. if (cursor.getCount() > 0) {
    34.  
    35.  
    36. while (cursor.moveToNext()) {
    37. String contact_id = cursor.getString(cursor.getColumnIndex( _ID ));
    38. String name = cursor.getString(cursor.getColumnIndex(DISPLAY_NAME));
    39. int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(HAS_PHONE_NUMBER)));
    40.  
    41.  
    42. if (hasPhoneNumber > 0) {
    43. System.out.println("-Contacts name:" + name);
    44. output.append("/" + name);
    45. Cursor phoneCursor = contentResolver.query(PhoneCONTENT_URI, null,
    46. Phone_CONTACT_ID + " = ?", new String[] { contact_id }, null);
    47.  
    48.  
    49. while (phoneCursor.moveToNext()) {
    50. phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(NUMBER));
    51. //output.append(" ĐąĐ”Đ»Đ”Ń„ĐŸĐœ:" + phoneNumber);
    52.  
    53. System.out.println("-Contacts phone:" + phoneNumber);
    54. output.append("\\" + phoneNumber);
    55. countPhone++;
    56. }
    57. }
    58. }
    59. }
    60.  
    61. return output.toString();
    62. }

    файл .cpp

    DeviceInfo &DeviceInfo::instance(QObject *parent)
    {
    static DeviceInfo instance(parent);
    qDebug() << "DeviceInfo::instance:";
    return instance;
    }

    include "DeviceInfo.h"

    вместо кавычек нужно <> - сайт ломает текст
    include "QAndroidJniObject"
    include "QtAndroidExtras"
    include "QtAndroid"
    include "QRegExp"

    const QHash > DeviceInfo::getContacts()
    {
    QHash > hash_phoneBook;
    qulonglong phone_number;
    QAndroidJniObject activity = QtAndroid::androidActivity(); //jint phoneCount = activity.callMethod ("getContacts");
    QAndroidJniObject stringObj = activity.callObjectMethod ("getContacts");
    QString phoneAll = stringObj.toString();
    QString first_name;
    QString last_name;
    QString phone;

    1. QStringList list_phone = phoneAll.split('/', QString::SkipEmptyParts);
    2.  
    3. for(int i = 0; i < list_phone.count(); ++i)
    4. {
    5. QStringList list_name_phone = list_phone.at(i).split('\\', QString::SkipEmptyParts);
    6.  
    7. if(list_name_phone.count() > 0)
    8. first_name = list_name_phone.at(0);
    9.  
    10. if(list_name_phone.count() > 1)
    11. phone = list_name_phone.at(1);
    12. QRegExp regexp("(\\D+)");
    13.  
    14. phone.remove(regexp);
    15. phone_number = phone.toULongLong();
    16.  
    17. qDebug() << "DeviceInfo::getContacts:" << phone_number << phone_my << phone_my.toULongLong() << phone;
    18.  
    19. if(phone_number != phone_my.toULongLong()) {
    20.  
    21. if(phone_number != 0 && phone_number > 9999999999) {
    22.  
    23. QVector<QByteArray> vec_bArr;
    24. vec_bArr.append(QByteArray().append(first_name));
    25. hash_phoneBook.insert(QString::number(phone_number), vec_bArr);
    26. }
    27. }
    28.  
    29. }
    30. return hash_phoneBook;//(int) phoneCount;

    }

    void DeviceInfo::notify(QString msg)
    {
    QAndroidJniObject activity = QtAndroid::androidActivity(); //jint phoneCount = activity.callMethod ("getContacts");

    1. QAndroidJniObject javaNotification = QAndroidJniObject::fromString(msg);
    2. activity.callStaticMethod<void>("ltd/sota/QtAdMobActivity",
    3. "notify",
    4. "(Ljava/lang/String;)V",
    5. javaNotification.object<jstring>());

    }

      Comments

      Only authorized users can post comments.
      Please, Log in or Sign up
      • Last comments
      • Evgenii Legotckoi
        March 9, 2025, 9:02 p.m.
        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
      • VP
        March 9, 2025, 4:14 p.m.
        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
      • ИМ
        Nov. 22, 2024, 9:51 p.m.
        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
      • Evgenii Legotckoi
        Oct. 31, 2024, 11:37 p.m.
        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
      • A
        Oct. 19, 2024, 5:19 p.m.
        Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html