h
htyhty19. Oktober 2023 16:11

Контакты Android

c++, qt, android

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

2
Виктор Калесников
  • 19. Oktober 2023 16:45
  • (bearbeitet)

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

    Виктор Калесников
    • 20. Oktober 2023 04:29
    • (bearbeitet)

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

    }

      Kommentare

      Nur autorisierte Benutzer können Kommentare posten.
      Bitte Anmelden oder Registrieren
      Letzte Kommentare
      ИМ
      Игорь Максимов5. Oktober 2024 07:51
      Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
      d
      dblas55. Juli 2024 11:02
      QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
      k
      kmssr8. Februar 2024 18:43
      Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
      Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
      EVA
      EVA25. Dezember 2023 10:30
      Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
      Jetzt im Forum diskutieren
      J
      JacobFib17. Oktober 2024 03:27
      добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
      JW
      Jhon Wick1. Oktober 2024 15:52
      Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
      КГ
      Кирилл Гусарев27. September 2024 09:09
      Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
      F
      Fynjy22. Juli 2024 04:15
      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

      Folgen Sie uns in sozialen Netzwerken