(2)右上角菜单栏——添加好友(非通信部分)

本博文禁止随意转载
添加好友这块,目前开发了两种方式,一是直接搜索用户名或者手机号,二是调取手机通讯录,将里面的手机号提取出来用来搜索相应好友

布局部分

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal">
    <EditText
        android:id="@+id/name_text"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:hint="请输入对方用户名或手机号" />

    <ImageButton
        android:id="@+id/imageButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@android:drawable/ic_menu_add" />
</LinearLayout>

    <Button
        android:id="@+id/telephone_button"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:drawableLeft="@drawable/af_telephone"
        android:gravity="center_vertical"
        android:drawablePadding="10dp"
        android:text="通过手机通讯录添加好友" />

    <Button
        android:id="@+id/trait_button"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:drawableLeft="@drawable/af_trait"
        android:gravity="center_vertical"
        android:drawablePadding="10dp"
        android:text="按条件查找陌生人" />

</LinearLayout>

大体上没有上面新颖的部分,前面好多文章该讲的都讲了,这里就当作辅助参考吧

活动部分

public class AddFriendActivity extends AppCompatActivity {
    private EditText editText1;
    private Context mContext;//用于权限获取
    private String permission []= new String[]{Manifest.permission.READ_CONTACTS,Manifest.permission.CALL_PHONE};// 获取权限数组,排除掉这一行,下面的权限申请是公用的
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_addf);
        mContext=this;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
            boolean bb=true;// 检查该权限是否已经获取
            for (String ss:permission){
                int i = ContextCompat.checkSelfPermission(mContext, ss);// 权限是否已经 授权 GRANTED--授权 DINIED--拒绝
                if (i != PackageManager.PERMISSION_GRANTED) {// 如果没有授予该权限,就去提示用户请求
                    bb=false;
                    break;
                }
            }
            if (!bb){
                ActivityCompat.requestPermissions(this, permission,1);//申请权限
            }else{
                Toast.makeText( this," 拥有当前权限 ",Toast.LENGTH_SHORT).show();
            }
        }else{
// 6.0以下不需要动态申请
        }

因为安卓版本6.0以上,把这样随意申请权限的行为默认为危险行为需要在此处权限申请

   editText1 = (EditText) findViewById(R.id.name_text);
    ImageButton button0=(ImageButton)findViewById(R.id.imageButton);
    button0.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String inputText1 = editText1.getText().toString();
            int i=0,p=0,q=0;
            int[] a=new int[20];//用来储存多个数字
            List<User> users = LitePal.findAll(User.class);
            for (User user1 : users) {
                if(inputText1.equals(user1.getName())){
                    a[q]=i;//比如说第k位注册用户符合你的要求,就把k值赋予给a数组
                    q=q+1;
                    int e=(users.size()-1);
                    if(i>=e){
                        p=1;
                        Intent intent = new Intent(AddFriendActivity.this, AddFriendList.class);
                        intent.putExtra("extra_data", a);
                        startActivity(intent);
                        break;
                    }
                }
                i=i+1;
            }
            if(p==0) {
                String b = "此用户不存在";
                Toast.makeText(AddFriendActivity.this, b, Toast.LENGTH_SHORT).show();
            }
        }
    });

这里加好友时的检索逻辑与前面的登录时的检索逻辑是一样的,但是这里需要向下一个活动传递你所搜的用户,这里因为考虑到以后会出现重名问题以及通过其他个人信息大范围检索时需要向活动传递多种数据,就使用了数组作为传递对象,并且传递的结果为此用户是注册的第几位,而不是使用名字,这里因为还没考虑到通信,所以如果传输成功的话,下一个活动会显示此用户是第几位。

   Context context = this;
        Button button1=(Button)findViewById(R.id.telephone_button);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                   Cursor cursor =context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,null,null,null);
                    String phoneNumber;
                    String phoneName;

Cursor将通讯录里的信息以行的形式读取, 讲一下 getContentResolver().query后的五个参数,其他都好弄懂,第一个实质上是Uri,是用来区分提供图片,提供断行这些provider的唯一标识符,手机通讯录的标识就是上面代码的第一个参数 ,第二个参数就是用来限制你所搜索的数据的范围(数据的形式,比如说名字,电话等),基本没必要, 第三个参数是用来限制搜索后所呈现的具体内容(比如说张三,120等),第四个参数辅助第三个参数,第五个参数决定数据的排序方法(升序降序等)

 while (cursor.moveToNext()){//每循环以此就移向下一位通讯录人员
                                                              phoneNumber=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    phoneName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    Log.d("AddFriendActivity",phoneName + "  "+ phoneNumber);
                }

        }
    });

这里暂时是将手机通讯录中的所有联系人姓名和手机号在AS中的logcat中打印出来,通信部分到位后会继续修改

总结:除了权限部分,其他地方多多少少和前面的码有重合的地方,数据库也早就处理好,所以敲起来比较快
优化部分: (1)可以通过用户其他条件(地域年龄等)在数据库中检索到相应用户再一一呈现出来
(2)群聊部分,在加好友后可以直接创建群聊并且拉自己选择的人进群,用碎片或者直接在下面加按钮都行
(3)个人可以设置权限,能直接添加好友成功也能先发出验证消息或者回答问题

上一篇:Android系统完整的权限列表


下一篇:Git push/pull的时候报403或者提交时报错:Permission to XXX.git denied to user