本文章基于Bmob服务器的图片上传。 想了解其他服务器上传请绕道
本文章功能是单图片上传,批上传函数略有不同,自己去Bmob文档里面查看函数。
1、首先布局
很简单的布局, 就圆框Image使用有点技巧
gradle app里面加 :implementation 'de.hdodenhof:circleimageview:2.0.0'
XML:
<de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_gravity="center_horizontal" android:id="@+id/head_image" android:layout_width="120dp" android:layout_height="120dp" android:src="@drawable/ic_launcher_background" android:layout_centerHorizontal="true" android:layout_marginTop="60dp" app:civ_border_width="0.5dp" app:civ_border_color="#4a9bec" /> <Button android:id="@+id/registre_button_signup" android:layout_width="140dp" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" android:textSize="15dp" android:hint="Sign up" android:layout_height="40dp" android:text="upload"/>
2、我的数据类
public class IpetUser extends BmobUser{ public IpetUser(BmobFile user_pic) { User_pic = user_pic; } public IpetUser(String objectId){setObjectId(objectId);} private BmobFile User_pic; public BmobFile getUser_pic() { return User_pic; } public void setUser_pic(BmobFile user_pic) { User_pic = user_pic; } }
字段与Bmob数据库里面的一致, 因为就操作头像(User_pic)数据,就不声明其他数据了。
3、MainActivity 里面的代码
注意几个地方:
- Bmob APPID 用你自己的;
- 我用了ButterKnife快捷声明控件对象 ,不懂的自己百度,配置方法我也写了篇文章 ——> 点击打开链接
- 相册接口调用我就不逼逼了,自己翻书 。这个相册借口调用的方法适用Android4.4版本以下。4.4以上调用方法复杂一点,想了解自己查资料吧。 推荐书籍《第一行代码》
这是第一个函数,上传图片到Bmob 的文件管理里面。
红圈里面的参数必须是 图片的真实地址!! (4.4以下获取真实地址容易,4.4以上获取就有所改动,不过大多APP都是4.4以下)
然后再写第二个函数 saveFile(file) ,用于保存BmobFile数据类型的数据 到相应的表里面 ,实际上是一个地址URL。
红圈是指定表里 , ID 为
zr3TKKKo
的那条数据 。
public class MainActivity extends AppCompatActivity { @BindView(R.id.head_image) CircleImageView headImage; @BindView(R.id.registre_button_signup) Button registreButtonSignup; public static final int CHOOSE_PHOTO=2; String mpath=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Bmob默认初始化 Bmob.initialize(this, "XXXXXXX"); //ButterKnife初始化 ButterKnife.bind(this); registreButtonSignup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); /* 开启Pictures画面Type设定为image */ intent.setType("image/*"); /* 使用Intent.ACTION_GET_CONTENT这个Action */ intent.setAction(Intent.ACTION_GET_CONTENT); /* 取得相片后返回本画面 */ startActivityForResult(intent, 1); } }); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { Uri uri = data.getData(); mpath = getImagePath(uri, null); //上传头像 final BmobFile file=new BmobFile(new File(mpath)); file.upload(new UploadFileListener() { @Override public void done(BmobException e) { if(e==null){ saveFile(file); } } }); ContentResolver cr = this.getContentResolver(); try { Log.e("qwe",mpath.toString()); Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri)); /* 将Bitmap设定到ImageView */ headImage.setImageBitmap(bitmap); } catch (FileNotFoundException e) { Log.e("qwe", e.getMessage(),e); } } super.onActivityResult(requestCode, resultCode, data); } private void saveFile(BmobFile file) { IpetUser user=new IpetUser("zr3TKKKo"); user.setUser_pic(file); user.update(new UpdateListener() { @Override public void done(BmobException e) { if(e==null){ Toast.makeText(MainActivity.this,"上传成功",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(MainActivity.this,"上传失败",Toast.LENGTH_SHORT).show(); } } }); } private String getImagePath(Uri uri, String seletion) { String path = null; Cursor cursor = getContentResolver().query(uri, null, seletion, null, null); if (cursor != null) { if (cursor.moveToFirst()) { path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); } cursor.close(); } return path; } }
结尾:第二次写请大家多多指教。有错误请在评论区指正 ,我好进步 !~~~
该功能就只能上传图片和改变_user表里 BmobFile 数据的值。 就是上传图片到服务器功能