h
htyhty19 октября 2023 г. 16:11

Контакты Android

c++, qt, android

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

2
Виктор Калесников
  • 19 октября 2023 г. 16:45
  • (ред.)

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

    Виктор Калесников
    • 20 октября 2023 г. 4:29
    • (ред.)

    делал в далеком 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;

    public QtAdMobActivity()
    {
        System.out.println("QtAdMobActivity: initialize");
        m_instance = this;
    }
    

    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");
    }

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

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

        //m_instance = this;//notify
        //m_instance.notify("test");
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    
                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};
                boolean flag = false;
    
                for (int i = 0; i < permissions.length; i++)
                {
                        if (checkSelfPermission(permissions[i]) == PackageManager.PERMISSION_DENIED)
                        {
                            flag = true;
                            break;
                        }
                }
                if (flag)
                {
                    requestPermissions(permissions, 1);
                }
    

    /*

            System.out.println("onCreate 1:");
            if (m_notificationManager == null) {
                System.out.println("onCreate 2:");
                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");
            }
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
            && !m_notificationManager.isNotificationPolicyAccessGranted()) {
                System.out.println("onCreate 3:");
    
            Intent intent = new Intent(
                                android.provider.Settings
                                .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
    
            startActivity(intent);
        }
            //--------
    

    */

                //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 String getContacts() {
    
        System.out.println("--------------getContacts----------------");
    
        String phoneNumber = null;
        int countPhone = 0;
    
    
        Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI;
        String _ID = ContactsContract.Contacts._ID;
        String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
        String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER;
    
        Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
        String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
    
        StringBuffer output = new StringBuffer();
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(CONTENT_URI, null,null, null, null);
    
    
        if (cursor.getCount() > 0) {
    
    
            while (cursor.moveToNext()) {
                String contact_id = cursor.getString(cursor.getColumnIndex( _ID ));
                String name = cursor.getString(cursor.getColumnIndex(DISPLAY_NAME));
                int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(HAS_PHONE_NUMBER)));
    
    
                if (hasPhoneNumber > 0) {
                    System.out.println("-Contacts name:" + name);
                    output.append("/" + name);
                    Cursor phoneCursor = contentResolver.query(PhoneCONTENT_URI, null,
                    Phone_CONTACT_ID + " = ?", new String[] { contact_id }, null);
    
    
                    while (phoneCursor.moveToNext()) {
                        phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(NUMBER));
                        //output.append(" ĐąĐ”Đ»Đ”Ń„ĐŸĐœ:" + phoneNumber);
    
                        System.out.println("-Contacts phone:" + phoneNumber);
                        output.append("\\" + phoneNumber);
                        countPhone++;
                    }
                }
            }
        }
    
    return output.toString();
    }
    

    файл .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;

    QStringList list_phone = phoneAll.split('/', QString::SkipEmptyParts);
    
    for(int i = 0; i <  list_phone.count(); ++i)
    {
        QStringList list_name_phone = list_phone.at(i).split('\\', QString::SkipEmptyParts);
    
        if(list_name_phone.count() > 0)
            first_name = list_name_phone.at(0);
    
        if(list_name_phone.count() > 1)
            phone = list_name_phone.at(1);
        QRegExp regexp("(\\D+)");
    
        phone.remove(regexp);
        phone_number = phone.toULongLong();
    
        qDebug() << "DeviceInfo::getContacts:" << phone_number << phone_my << phone_my.toULongLong() << phone;
    
        if(phone_number != phone_my.toULongLong()) {
    
            if(phone_number != 0 && phone_number > 9999999999) {
    
                QVector<QByteArray> vec_bArr;
                vec_bArr.append(QByteArray().append(first_name));
                hash_phoneBook.insert(QString::number(phone_number), vec_bArr);                
            }
        }
    
    }
    return hash_phoneBook;//(int) phoneCount;
    

    }

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

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

    }

      Комментарии

      Только авторизованные пользователи могут публиковать комментарии.
      Пожалуйста, авторизуйтесь или зарегистрируйтесь
      АФ

      C++ - Тест 004. Указатели, Массивы и Циклы

      • Результат:30баллов,
      • Очки рейтинга-10
      ПЩ

      C++ - Тест 004. Указатели, Массивы и Циклы

      • Результат:80баллов,
      • Очки рейтинга4
      d

      C++ - Тест 005. Структуры и Классы

      • Результат:50баллов,
      • Очки рейтинга-4
      Последние комментарии
      k
      kmssr9 февраля 2024 г. 0:43
      Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
      АК
      Анатолий Кононенко5 февраля 2024 г. 7:50
      Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
      EVA
      EVA25 декабря 2023 г. 16:30
      Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
      J
      JonnyJo25 декабря 2023 г. 14:38
      Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
      G
      Gvozdik19 декабря 2023 г. 3:01
      Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
      Сейчас обсуждают на форуме
      P
      Pisych27 февраля 2023 г. 10:04
      Как получить в массив значения из связанной модели? Спасибо, разобрался:))
      AC
      Alexandru Codreanu19 января 2024 г. 17:57
      QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
      BlinCT
      BlinCT27 декабря 2023 г. 14:57
      Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
      Дмитрий
      Дмитрий10 января 2024 г. 10:18
      Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
      Evgenii Legotckoi
      Evgenii Legotckoi12 декабря 2023 г. 12:48
      Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

      Следите за нами в социальных сетях