【问题标题】:Provide Contact Info For Unknown Number提供未知号码的联系信息
【发布时间】:2017-01-25 10:56:41
【问题描述】:

您知道何时有未知号码呼叫您,而不是号码,您看到的是实际呼叫您的公司名称。据我所知,Android 通过一些谷歌服务获取这些信息。

如果我想制作一个应用程序,我应该怎么做?如果未知号码呼叫您,我希望 Android 要求我的应用程序提供此号码的信息。

我在文档中搜索found this。这里说:

目录最重要的用例是搜索。目录提供程序应至少支持 Contacts.CONTENT_FILTER_URI。如果目录提供商想要参与电子邮件和电话查找功能,它还应该实现 CommonDataKinds.Email.CONTENT_FILTER_URI 和 CommonDataKinds.Phone.CONTENT_FILTER_URI。

据我了解,我需要实现一个 ContactsContract.Directory。我尝试了一些东西,但我无法让它工作。

你能告诉我我应该怎么做吗,你能给我一个关于提供联系信息如何工作的很好的解释吗?这个目录的一个很好的例子也很好。

编辑: 我尝试了什么 - 我创建了一个示例应用程序,创建了自己的提供程序并将其注册到清单中。我添加了所需的元数据,如文档所示:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.sample.contactprovidertest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <provider
            android:authorities="com.sample.contactprovidertest"
            android:name=".MyProvider"
            android:enabled="true"
            android:exported="true">
            <meta-data
                android:name="android.content.ContactDirectory"
                android:value="true"/>
        </provider>
    </application>

</manifest>

MyProvider.java

public class MyProvider extends ContentProvider {

    private static final String TAG = "MyProvider";

    @Override
    public boolean onCreate() {

        return true;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri,
                        String[] projection,
                        String selection,
                        String[] selectionArgs,
                        String sortOrder) {
        // this is never called
        Toast.makeText(getContext(), "it works!", Toast.LENGTH_SHORT).show();
        if (ContactsContract.Directory.CONTENT_URI.equals(uri)) {
            Log.d(TAG, "query: " + uri);
        }

        return null;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}

【问题讨论】:

  • I tried something but I can't get it to work. - 您可以发布您尝试过的内容吗?也许我们可以找到它的问题。
  • @MichaelDodd 我添加了我的样本。即使我们发现了问题,解释一下这个东西是如何工作的也是很好的。感谢您的回复。

标签: android android-contentprovider android-contacts contactscontract


【解决方案1】:

来自您链接到的文档:

客户端通过 Contacts Provider 与目录交互 提供一个可选的 directory= 查询参数。

当 Contacts Provider 收到请求时,它会转换 URI 并将请求转发到对应的目录内容 提供者

当来电应用程序作为来电的响应启动时,它会查询 Contacts Provider 以查找本地联系人,并且还可能为 Google 的 Global Address List 提供 directory= 参数作为备用搜索(如果在本地找不到) .

我认为没有办法让来电应用也询问您的目录。

你可以做什么:

所有来电显示应用的作用是在来电屏幕顶部显示一个弹出对话框。 见How to create always-top fullscreen overlay activity in Android

在线阅读LayoutParams.TYPE_SYSTEM_ALERT

【讨论】:

  • 在我的手机应用程序中(在 Nougat 上),我看到“正向搜索”、“人员搜索”和“反向查找”提供程序的选项;选择后,我可以从一组列表中选择提供者。所以看起来可以添加更多目录,我只是不知道现有的目录是如何到达那里的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多