简体   繁体   English

如何获取 SMS 对话/线程列表? 并在 ListView 中显示联系人姓名?

[英]How to Fetch a List of SMS Conversation/Thread? And Display Name Of Contact in ListView?

I'm Developing an SMS app, I was able to fetch list of SMS but I want to show them as a Conversation, How can I achieve It easily since I'm a beginner.我正在开发一个短信应用程序,我能够获取短信列表,但我想将它们显示为对话,因为我是初学者,如何轻松实现它。

MyChatFragment.java; MyChatFragment.java;

    public class AwayFragment extends Fragment {
    public AwayFragment() {
    // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                           Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.MyChatFragment, container, false);

    // Inflate the layout for this fragment

    int permissioncheck = ContextCompat.checkSelfPermission(getActivity(), 
    Manifest.permission.READ_SMS);
    ListView lv = (ListView) view.findViewById(R.id.listView2);
    final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;

    ArrayList<String> smsList;
    smsList = new ArrayList<>();


    Uri inboxUri = Uri.parse("content://sms/sent/");
    final String[] projection = new String[]{"*"};
    ContentResolver contentResolver = getActivity().getContentResolver();

    Cursor cursor = contentResolver.query(inboxUri, projection, null, null, null);

    if(permissioncheck == PackageManager.PERMISSION_GRANTED){
        ArrayAdapter<String> lva = new ArrayAdapter<String>(
                getActivity(), android.R.layout.simple_list_item_1, smsList);
        lv.setAdapter(lva);
    } else{
        ActivityCompat.requestPermissions(getActivity(), new String[]{ Manifest.permission.READ_SMS}, 
    PERMISSIONS_REQUEST_READ_CONTACTS);
    }
     final String TAG = FetchingInboxActivity.class.getSimpleName();

     while (cursor.moveToNext()) {

        String number = cursor.getString(cursor.getColumnIndexOrThrow("address")).toString();
        String thread_id = cursor.getString(cursor.getColumnIndexOrThrow("thread_id")).toString();
        String body = cursor.getString(cursor.getColumnIndexOrThrow("body")).toString();
        smsList.add("Number: " + number + "\n" + "Body: " + body + "\n" + "Thread_ID: " + thread_id);
        Log.d(TAG, "showcontacts: ");

        final SwipeRefreshLayout mSwipeRefreshLayout = (SwipeRefreshLayout) 
     view.findViewById(R.id.fragment_away);

        mSwipeRefreshLayout.setOnRefreshListener(
                () -> {
                    ((MainActivity) getActivity()).refreshNow();
                    Toast.makeText(getContext(), "Refresh Layout working", Toast.LENGTH_LONG).show();
                }
        );

    }
    return view;
       }
    }

Also, When I'm trying 'content://sms/conversations/' instead of 'content://sms/' I'm showing errors另外,当我尝试使用“content://sms/conversations/”而不是“content://sms/”时,我会显示错误

    java.lang.IllegalArgumentException: Invalid column *

As I mention in my comment, you should move cursor to the first row, before you'll start to read it.正如我在评论中提到的,在开始阅读之前,您应该将 cursor 移到第一行。 Below code works for me in android 10. I'm using this inside if statement, because cursor may be empty, so method will return false.下面的代码在 android 10 中适用于我。我在 if 语句中使用这个,因为 cursor 可能为空,所以方法将返回 false。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.MyChatFragment, container, false);

    // Inflate the layout for this fragment

    int permissioncheck = ContextCompat.checkSelfPermission(getActivity(),
            Manifest.permission.READ_SMS);
    ListView lv = (ListView) view.findViewById(R.id.listView2);
    final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;

    ArrayList<String> smsList;
    smsList = new ArrayList<>();


    Uri inboxUri = Uri.parse("content://sms/sent/");
    final String[] projection = new String[]{"*"};
    ContentResolver contentResolver = getActivity().getContentResolver();

    Cursor cursor = contentResolver.query(inboxUri, projection, null, null, null);

    if(permissioncheck == PackageManager.PERMISSION_GRANTED){
        ArrayAdapter<String> lva = new ArrayAdapter<String>(
                getActivity(), android.R.layout.simple_list_item_1, smsList);
        lv.setAdapter(lva);
    } else{
        ActivityCompat.requestPermissions(getActivity(), new String[]{ Manifest.permission.READ_SMS},
                PERMISSIONS_REQUEST_READ_CONTACTS);
    }
    final String TAG = FetchingInboxActivity.class.getSimpleName();

    if (cursor.moveToFirst()) {
        while (cursor.moveToNext()) {

            String number = cursor.getString(cursor.getColumnIndexOrThrow("address"));
            String thread_id = cursor.getString(cursor.getColumnIndexOrThrow("thread_id"));
            String body = cursor.getString(cursor.getColumnIndexOrThrow("body"));
            smsList.add("Number: " + number + "\n" + "Body: " + body + "\n" + "Thread_ID: " + thread_id);
            Log.d(TAG, "showcontacts: ");

            final SwipeRefreshLayout mSwipeRefreshLayout = (SwipeRefreshLayout)
                    view.findViewById(R.id.fragment_away);

            mSwipeRefreshLayout.setOnRefreshListener(
                    () -> {
                        ((MainActivity) getActivity()).refreshNow();
                        Toast.makeText(getContext(), "Refresh Layout working", Toast.LENGTH_LONG).show();
                    }
            );

        }
    }
    return view;
}

Be carefur, when you use toString() on some data from database, because sometime it may be null, so null to string throw an exception.请注意,当您对数据库中的某些数据使用toString()时,因为有时它可能是 null,因此 null 字符串会引发异常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM