android - 使用 Intent 显示通话记录中的特定联系人

标签 android

我正在尝试显示通话记录中的号码。我的应用程序中有一个按钮,它将用户重定向到电话的调用日志 Activity ,当用户选择联系人时,它将显示在主要 Activity 的 TextView 中。我在 list 中添加了读取通话记录的权限,但出现此错误:

08-17 16:54:17.113: E/AndroidRuntime(18121): FATAL EXCEPTION: main
    08-17 16:54:17.113: E/AndroidRuntime(18121): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.PICK dat=content://call_log/calls }
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1628)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1423)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at android.app.Activity.startActivityForResult(Activity.java:3388)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at android.app.Activity.startActivityForResult(Activity.java:3349)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at com.example.callogdemo.MainActivity$1.onClick(MainActivity.java:32)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at android.view.View.performClick(View.java:4211)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at android.view.View$PerformClick.run(View.java:17446)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at android.os.Handler.handleCallback(Handler.java:725)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at android.os.Handler.dispatchMessage(Handler.java:92)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at android.os.Looper.loop(Looper.java:153)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at android.app.ActivityThread.main(ActivityThread.java:5297)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at java.lang.reflect.Method.invokeNative(Native Method)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at java.lang.reflect.Method.invoke(Method.java:511)
    08-17 16:54:17.113: E/AndroidRuntime(18121):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)

代码:

button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setData(android.provider.CallLog.Calls.CONTENT_URI);
                    startActivityForResult(intent, 0);
                }
            });



    public void onActivityResult(int requestCode, int resultCode, Intent intent)
    {
        String[] callLogFields = { android.provider.CallLog.Calls._ID,
                android.provider.CallLog.Calls.NUMBER,
                android.provider.CallLog.Calls.CACHED_NAME };
        String phoneNumber="Not Selected Yet" ;
        Cursor c =  managedQuery(intent.getData(), callLogFields, null, null, null);
        if(c!=null && c.moveToFirst())
        {
    phoneNumber=c.getString(c.getColumnIndex(android.provider.CallLog.Calls.NUMBER));
        }
        c.close();
        textview.setText(phoneNumber);
    }

最佳答案

那是因为你根本做不到。
Android 不提供 ACTION_PICK 通话记录的方法。
但您可以使用此解决方法在您的应用程序上显示列表。

        String[] strFields = { android.provider.CallLog.Calls._ID, android.provider.CallLog.Calls.NUMBER,
                android.provider.CallLog.Calls.CACHED_NAME, };
        String strOrder = android.provider.CallLog.Calls.DATE + " DESC";
        final Cursor cursorCall = getActivity().getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, strFields, null, null,
                strOrder);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Select recent contact");
        android.content.DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogInterface, int item) {
                cursorCall.moveToPosition(item);
                Toast.makeText(getActivity(), cursorCall.getString(cursorCall.getColumnIndex(android.provider.CallLog.Calls.NUMBER)),
                        Toast.LENGTH_LONG).show();
                cursorCall.close();
                return;
            }
        };
        builder.setCursor(cursorCall, listener, android.provider.CallLog.Calls.CACHED_NAME);
        builder.create().show();

这将需要以下权限:

<uses-permission android:name="android.permission.READ_CALL_LOG" />

关于android - 使用 Intent 显示通话记录中的特定联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25348801/

相关文章:

javascript - com.android.build.gradle.internal.api.ApplicationVariantImpl 类型的对象存在问题 "Could not get unknown property ' mergeResourcesProvider。”

java - 无法解析 java.lang.ClassCastException

android - 自定义 ListView 上的 setOnItemClickListener

android - 应用程序销毁时停止服务

java - 带定制适配器的 NPE

java - 访问 Android 相机时 Intent 出现 NullPointerException

android - 确定 Play 商店所在国家/地区

android - 使用 RXJAVA 处理显示进度条的服务器延迟

android - 在 Android 中通过代码触发 View 的 onTouchEvent

androidTest 中的 Android LiveData 返回 null