个人信息页面的修改及头像的裁剪上传

时间:2021-01-24 21:09:35

        1.IM通讯云提供了用户资料的托管,只需要调用简单的接口就可以实现用户资料的获取和更改,

            2.当然也可以进行用户的自定义字段

            3.我们一般是按照用户进行资料进行获取字段,TIMManager initFriendShipSettings方法获取的资料字段,方便灵活的进行资料的获取,

[html]  view plain  copy
  1. public void initFriendshipSettings(long flags,@Nullable List<String> customFields)  

            flags:系统默认的字段 比如:昵称,头像url

            customFields:自定义的字段,可以为null    

[html]  view plain  copy
  1. List<String> customInfos = new ArrayList<String>();  
  2.         customInfos.add(CustomProfile.CUSTOM_GET);  
  3.         customInfos.add(CustomProfile.CUSTOM_SEND);  
  4.         customInfos.add(CustomProfile.CUSTOM_LEVEL);  
  5.         customInfos.add(CustomProfile.CUSTOM_RENZHENG);  
  6.         TIMManager.getInstance().initFriendshipSettings(CustomProfile.allBaseInfo, customInfos);  

            当然这都是在我们的applocation中获取的,当我们登录成功的时候就需要获取我们用户的资料,

        4.获取用户的资料

                TIMFriendshipmanager 的 getSelfProfile方法获去自己的资料,默认只拉取基本资料,如果只需要获取个别字段或者自定义字段 可以使用 按照字段获取用户资料 ,此方法全局有效
                
[html]  view plain  copy
  1. public void getSelfProfile(TIMValueCallBack<TIMUserProfile> cb)  
                
[html]  view plain  copy
  1. TIMFriendshipManager.getInstance().getSelfProfile(new TIMValueCallBack<TIMUserProfile>() {  
  2.            @Override  
  3.            public void onError(int i, String s) {  
  4.                Toast.makeText(LoginActivity.this, "获取信息失败:" + s, Toast.LENGTH_SHORT).show();  
  5.            }  
  6.   
  7.            @Override  
  8.            public void onSuccess(TIMUserProfile timUserProfile) {  
  9.                //获取自己信息成功  
  10.                BearApplication.getApplication().setSelfProfile(timUserProfile);  
  11.            }  
  12.        });  
            这就是获取自己的信息 , 一下是对TIMUserprofile的一些成员方法介绍
     TIMUserProfile 成员方法:
        
[html]  view plain  copy
  1. /**  
  2. * 获取用户的identifier  
  3. * @return 用户的identifier  
  4. */  
  5. public String getIdentifier()  
  6.   
  7. /**  
  8. * 获取用户的昵称  
  9. * @return 用户的昵称  
  10. */  
  11. public String getNickName()  
  12.   
  13. /**  
  14. * 获取用户头像URL  
  15. * @return 用户头像URL  
  16. */  
  17. public String getFaceUrl()  
  18.   
  19. /**  
  20. * 获取用户个人签名  
  21. * @return 用户个人签名  
  22. */  
  23. public String getSelfSignature()  
  24.   
  25. /**  
  26. * 获取用户加好友的选项  
  27. * @return 用户好友选项  
  28. */  
  29. public TIMFriendAllowType getAllowType()  
  30.   
  31. /**  
  32. * 获取用户备注  
  33. * @return 用户备注  
  34. */  
  35. public String getRemark()  
  36.   
  37. /**  
  38. * 获取被加入的好友分组列表  
  39. * @return 分组列表  
  40. */  
  41. public List<String> getFriendGroups()  
  42.   
  43. /**  
  44. * 获取用户自定义信息  
  45. * @return 自定义信息Map  
  46. */  
  47. public Map<String, byte[]> getCustomInfo()  
  48.   
  49. /**  
  50. * 获取用户性别类型  
  51. * @return 用户性别类型  
  52.  */  
  53. public TIMFriendGenderType getGender()  
  54.   
  55. /**  
  56. * 获取用户生日信息  
  57. * @return 生日信息  
  58.  */  
  59. public long getBirthday()  
  60.   
  61. /**  
  62. * 获取语言  
  63. * @return 语言  
  64.  */  
  65. public long getLanguage()  
  66.   
  67. /**  
  68. * 获取位置信息  
  69. * @return 位置信息  
  70.  */  
  71. public String getLocation()  
        现在我们拿到了自己的信息,然后我们进行自己信息的修改,
        这个方法是设置我们的昵称
[html]  view plain  copy
  1. public void setNickName(@NonNull String var1, TIMCallBack var2)   
       包括系统的字段我们都可以进行set方法进行设置
        但是我们的自定义字段怎么设置呢? 请看下面
        

设置自己的自定义字段

        
[html]  view plain  copy
  1. public void setCustomInfo(String key, byte[] value, TIMCallBack cb)  
    key:我们自定义字段的key
    vakue: 我们自定义字段的value
    cb: 检测是否成功修改的监听

    二。头像的选择

        1.还是先上图

[html]  view plain  copy
  1. Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  2.  tempUri = Uri.fromFile(new File(Environment  
  3.          .getExternalStorageDirectory(), "image.jpg"));  
  4.  // 指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换  
  5.  openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);  
  6.  startActivityForResult(openCameraIntent, TAKE_PICTURE);  
        这是我的拍照功能的代码,通过这几行就可以调用相机进行拍照返回的结果在onactivityforresult里面进行处理
    
[html]  view plain  copy
  1. Intent openAlbumIntent = new Intent(  
  2.          Intent.ACTION_GET_CONTENT);  
  3.  openAlbumIntent.setType("image/*");  
  4.  startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);  
    这个是我们的相册,进行调用的代码,    
下面是我们的返回的统一处理
    
[html]  view plain  copy
  1. @Override  
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.         super.onActivityResult(requestCode, resultCode, data);  
  4.         if (resultCode == RESULT_OK) { // 如果返回码是可以用的  
  5.             switch (requestCode) {  
  6.             case 相机的:  
  7.                 startPhotoZoom(tempUri); // 开始对图片进行裁剪处理  
  8.                 break;  
  9.             case 相册的:  
  10.                 startPhotoZoom(data.getData()); // 开始对图片进行裁剪处理  
  11.                 break;  
  12.             case 统一裁剪完的图片:  
  13.                 if (data != null) {  
  14.                     setImageToView(data); // 让刚才选择裁剪得到的图片显示在界面上  
  15.                 }  
  16.                 break;  
  17.             }  
  18.         }  
  19.     }  
        startPhotoZoom的处理
            
[html]  view plain  copy
  1. protected void startPhotoZoom(Uri uri) {  
  2.         if (uri == null) {  
  3.             Log.i("tag", "The uri is not exist.");  
  4.         }  
  5.         tempUri = uri;  
  6.         Intent intent = new Intent("com.android.camera.action.CROP");  
  7.         intent.setDataAndType(uri, "image/*");  
  8.         // 设置裁剪  
  9.         intent.putExtra("crop", "true");  
  10.         // aspectX aspectY 是宽高的比例  
  11.         intent.putExtra("aspectX", 1);  
  12.         intent.putExtra("aspectY", 1);  
  13.         // outputX outputY 是裁剪图片宽高  
  14.         intent.putExtra("outputX", 150);  
  15.         intent.putExtra("outputY", 150);  
  16.         intent.putExtra("return-data", true);  
  17.         startActivityForResult(intent, CROP_SMALL_PICTURE);  
  18.     }  
        
[html]  view plain  copy
  1. setImageToView的处理就是进行图片的保存并上传到服务器  
           上传我们首先了解一下token是什么
    首先Token是一个怎么样的东西,Token存在的意义又在哪里?学过php或是其他web开发的人都知道一个东西叫session和cookie,这些东西可以在服务器或是本地保存一些东西,比如说登录状态,当用户登录后可以通过session或是cookie在本地保存一段时间的登录状态,在这段时间内,用户再度登录的时候就不用再输入用户名和密码了,但是过了一段时间后,用户需要再次进行身份认证,这样一来的话,一方面节省了很多操作的步骤提升了操作体验,同时也节省了很多服务器请求,提高了服务器性能,同时也保证了一定的安全性。

那么这个功能如何在android中实现呢?很可惜的是在android中并没有直接提供类似session或cookie的东西,这个时候就是通过Token来完成。Token的存在更像是一个令牌,比如说当我们需要实现具有用户权限的操作时,每一次操作都需要向服务器发送请求,让服务器完成在数据库中进行用户名和密码,这些显然对于服务器的性能是很不利的。当然有人也会说我们可以在一次请求成功后将类似于user_id的东西保存在本地,以后每次请求的时候用user_id进行操作,这样不是就降低了服务器的负担,但是这样的话存在一个问题,就是user_id一旦存储在本地的时候,不是太有可能会自动回收掉,这样一来的话就会导致一个问题,就是app无论何时打开都是验证通过的状态,这样一来安全性降低。而Token就是解决这样一个问题的东西:

以上这些话总结一下就是token的定义:

     Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

    我是用的七牛云进行的头像的上传,我们从服务器上获取我们的token,然后进行头像的上传即可,当然上传这个我放到网路请求的框架这一节来进行详细的讲解