Android 无法使用加载程序回调方法检索联系人

Android 无法使用加载程序回调方法检索联系人,android,android-loader,Android,Android Loader,我正在构建一个简单的应用程序,我想从手机中检索所有联系人,并将其显示在文本视图中。使用加载程序回调方法进行相同的操作,但按下加载按钮后会出现一个空白屏幕。还提供了相同的读写权限。在下面发布我的代码,请帮助。 提前谢谢 MainActivity.java package com.example.sumeet.contentproviderdemoyoutube; import android.app.LoaderManager; import android.content.CursorLoad

我正在构建一个简单的应用程序,我想从手机中检索所有联系人,并将其显示在文本视图中。使用加载程序回调方法进行相同的操作,但按下加载按钮后会出现一个空白屏幕。还提供了相同的读写权限。在下面发布我的代码,请帮助。 提前谢谢

MainActivity.java

package com.example.sumeet.contentproviderdemoyoutube;

import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener, LoaderManager.LoaderCallbacks<Cursor> {
    TextView textView;
    Button button;
    String TAG = "Show";

    private String mColumnProjection[] = new String[]{
            ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
            ContactsContract.Contacts.CONTACT_STATUS,
            ContactsContract.Contacts.HAS_PHONE_NUMBER};

    private String mSelectionClause = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + "='Simpi'";
    private String[] mSelectionArguments = new String[]{"Simpi"};
    private String mOrderBy = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.tv_show);
        button = (Button) findViewById(R.id.load);
        //   ContentResolver contentResolver = getContentResolver();
//        Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI,
//                mColumnProjection,
//                mSelectionClause,
//                null,
//                null);


    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.load:
                getLoaderManager().initLoader(1, null, this);
                Toast.makeText(this, "Button Clicked", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }

    }


    @Override
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
        if (i == 1) {
            Toast.makeText(this, "Inside onloader", Toast.LENGTH_SHORT).show();
            return new CursorLoader(this, ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        }

        return null;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        Toast.makeText(this, "OnFinish", Toast.LENGTH_SHORT).show();
        if (cursor != null && cursor.getCount() > 0) {
            StringBuilder stringBuilder = new StringBuilder("");
            while (cursor.moveToNext()) {
                stringBuilder.append(cursor.getString(0) + "," + cursor.getString(1) + "," + cursor.getString(2) + "\n");
            }
            textView.setText(stringBuilder.toString());
        } else {
            textView.setText("No Contacts to display");
        }

    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        Toast.makeText(this, "onLoader", Toast.LENGTH_SHORT).show();
    }
}
package com.example.sumeet.contentproviderdemoyoutube;
导入android.app.LoaderManager;
导入android.content.CursorLoader;
导入android.content.Loader;
导入android.database.Cursor;
导入android.os.Bundle;
导入android.provider.contacts合同;
导入android.support.v7.app.AppActivity;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入android.widget.Toast;
公共类MainActivity扩展AppCompatActivity实现View.OnClickListener、LoaderManager.LoaderCallbacks{
文本视图文本视图;
按钮;
String TAG=“Show”;
私有字符串mColumnProjection[]=新字符串[]{
Contacts contract.Contacts.DISPLAY\u NAME\u PRIMARY,
Contacts contract.Contacts.CONTACT\u状态,
Contacts contract.Contacts.HAS_PHONE_NUMBER};
私有字符串mSelectionClause=ContactsContract.Contacts.DISPLAY_NAME_PRIMARY+“='Simpi';
私有字符串[]mSelectionArguments=新字符串[]{“Simpi”};
私有字符串mOrderBy=Contacts contract.Contacts.DISPLAY\u NAME\u PRIMARY;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(textView)findViewById(R.id.tv_show);
按钮=(按钮)findViewById(R.id.load);
//ContentResolver ContentResolver=getContentResolver();
//Cursor Cursor=contentResolver.query(ContactsContract.Contacts.CONTENT\u URI,
//麦克伦投影,
//选择条款,
//空,
//无效);
}
公共void onClick(视图){
开关(view.getId()){
案例R.id.荷载:
getLoaderManager().initLoader(1,null,this);
Toast.makeText(此“按钮已点击”,Toast.LENGTH_SHORT).show();
打破
违约:
打破
}
}
@凌驾
公共加载器onCreateLoader(inti,Bundle){
如果(i==1){
Toast.makeText(这是“内部onloader”,Toast.LENGTH_SHORT.show();
返回新的游标加载程序(此,ContactsContract.Contacts.CONTENT\u URI,null,null,null);
}
返回null;
}
@凌驾
public void onLoadFinished(加载器,光标){
Toast.makeText(这是“OnFinish”,Toast.LENGTH_SHORT).show();
if(cursor!=null&&cursor.getCount()>0){
StringBuilder StringBuilder=新StringBuilder(“”);
while(cursor.moveToNext()){
stringBuilder.append(cursor.getString(0)+“,“+cursor.getString(1)+”,“+cursor.getString(2)+”\n”);
}
textView.setText(stringBuilder.toString());
}否则{
setText(“没有要显示的联系人”);
}
}
@凌驾
公共void onLoaderReset(加载器){
Toast.makeText(这是“onLoader”,Toast.LENGTH_SHORT).show();
}
}
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.sumeet.contentproviderdemoyoutube.MainActivity">

    <Button
        android:id="@+id/load"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Load" />

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</LinearLayout>

AndroidManifest.xml

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

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>
    </application>

</manifest>

onClick()中的init loader调用更改为

getLoaderManager().initLoader(1, null, this).forceLoad();
还声明

Blockquote必须通过
CursorLoader(Context,Uri,String[],String,String[],String)
或使用
CursorLoader(Context)
创建一个空实例,并使用
setUri(Uri)
setSelection填充所需的参数来构建游标Loader以执行查询(字符串)
setSelectionArgs(String[])
setSortOrder(String)
,以及
setProjection(String[])


尝试向CursorLoader构造函数提供此信息

当您在
onLoadFinished()中设置断点时,您的sdk版本和设备型号是什么
method并逐步浏览您的代码,您看到了什么?您好,我正在使用手机运行此应用程序。Lenovo Vibe k5、Android 5.1.1、API22@CommonsWare我在文本视图中没有得到任何输出。我甚至不确定是否调用了onLoadFinished()作为他们的输出,也没有错误。仍然一样。