From d7edf88eec79e8b3f19124322cd2901e850b23cd Mon Sep 17 00:00:00 2001
From: fangshicai <1312964935@qq.com>
Date: Fri, 24 Jun 2022 11:08:44 +0800
Subject: [PATCH] =?UTF-8?q?"=E5=8F=91=E5=B8=83=E5=95=86=E5=93=81=E6=88=90?=
=?UTF-8?q?=E5=8A=9F"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/misc.xml | 4 +-
app/build.gradle | 13 ++
app/src/main/AndroidManifest.xml | 25 ++-
.../com/android/activity/LoginActivity.java | 1 +
.../fragment/PublishProductFragment.java | 196 +++++++++++++++---
app/src/main/java/com/android/bean/Good.java | 16 ++
.../main/java/com/android/bean/ImageBean.java | 36 ++++
.../model/goods/GoodsHttp_interface.java | 6 +
.../model/upload/UpHttp_interface.java | 29 +++
.../com/android/model/upload/UpListener.java | 13 ++
.../com/android/model/upload/UpModel.java | 13 ++
.../com/android/model/upload/UpModelimpl.java | 101 +++++++++
.../main/java/com/android/utils/FileUtil.java | 171 +++++++++++++++
.../java/com/android/utils/GlideEngine.java | 156 ++++++++++++++
.../com/android/utils/watcher/MyWatcher.java | 9 +
app/src/main/res/layout/activity_login.xml | 1 +
.../main/res/layout/fragment_publish_page.xml | 81 ++++++--
17 files changed, 831 insertions(+), 40 deletions(-)
create mode 100644 app/src/main/java/com/android/bean/ImageBean.java
create mode 100644 app/src/main/java/com/android/model/upload/UpHttp_interface.java
create mode 100644 app/src/main/java/com/android/model/upload/UpListener.java
create mode 100644 app/src/main/java/com/android/model/upload/UpModel.java
create mode 100644 app/src/main/java/com/android/model/upload/UpModelimpl.java
create mode 100644 app/src/main/java/com/android/utils/FileUtil.java
create mode 100644 app/src/main/java/com/android/utils/GlideEngine.java
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 4c9840b..7aa308e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -36,9 +36,10 @@
-
+
+
@@ -46,6 +47,7 @@
+
diff --git a/app/build.gradle b/app/build.gradle
index d5df745..9a0fe86 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -74,6 +74,19 @@ dependencies {
implementation "androidx.cardview:cardview:1.0.0"
+// PictureSelector
+ // PictureSelector 基础 (必须)
+ implementation 'io.github.lucksiege:pictureselector:v3.10.2'
+ // 图片压缩 (按需引入)
+ implementation 'io.github.lucksiege:compress:v3.10.2'
+ // 自定义相机 (按需引入)
+ implementation 'io.github.lucksiege:camerax:v3.10.2'
+// api 'io.github.lucksiege:pictureselector:v2.7.3-rc05'
+
+
+
+
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index cd4f9cd..46bb642 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,6 +10,15 @@
+
+
+
+
+
+
+
+
+
+ >
@@ -52,6 +61,20 @@
+ requestLegacyExternalStorage=true
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/android/activity/LoginActivity.java b/app/src/main/java/com/android/activity/LoginActivity.java
index 55302cf..67bd347 100644
--- a/app/src/main/java/com/android/activity/LoginActivity.java
+++ b/app/src/main/java/com/android/activity/LoginActivity.java
@@ -110,6 +110,7 @@ public class LoginActivity extends AppCompatActivity implements LoginListener, V
Intent intent = new Intent(LoginActivity.this,HomePageActivity.class);
//发送登录的用户信息
EventBus.getDefault().postSticky(responseData);
+
startActivity(intent);
}else {
Log.e("login",responseData.getMsg());
diff --git a/app/src/main/java/com/android/activity/fragment/PublishProductFragment.java b/app/src/main/java/com/android/activity/fragment/PublishProductFragment.java
index ad13358..461b8a5 100644
--- a/app/src/main/java/com/android/activity/fragment/PublishProductFragment.java
+++ b/app/src/main/java/com/android/activity/fragment/PublishProductFragment.java
@@ -1,48 +1,71 @@
package com.android.activity.fragment;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.android.R;
+import com.android.activity.HomePageActivity;
+import com.android.bean.Good;
+import com.android.bean.ImageBean;
+import com.android.bean.ResponseData;
+import com.android.bean.User;
+import com.android.databinding.FragmentPublishPageBinding;
+import com.android.model.upload.UpListener;
+import com.android.model.upload.UpModelimpl;
+import com.android.utils.FileUtil;
+import com.android.utils.GlideEngine;
+import com.android.utils.ToastUtil;
+import com.luck.picture.lib.basic.PictureSelector;
+import com.luck.picture.lib.config.SelectMimeType;
+import com.luck.picture.lib.engine.CompressFileEngine;
+import com.luck.picture.lib.entity.LocalMedia;
+import com.luck.picture.lib.interfaces.OnKeyValueResultCallbackListener;
+import com.luck.picture.lib.interfaces.OnResultCallbackListener;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.RequestBody;
+import top.zibin.luban.Luban;
+import top.zibin.luban.OnCompressListener;
+import top.zibin.luban.OnNewCompressListener;
/**
* A simple {@link Fragment} subclass.
* create an instance of this fragment.
*/
-public class PublishProductFragment extends Fragment {
-
- // TODO: Rename parameter arguments, choose names that match
- // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
- private static final String ARG_PARAM1 = "param1";
- private static final String ARG_PARAM2 = "param2";
-
- // TODO: Rename and change types of parameters
- private String mParam1;
- private String mParam2;
+public class PublishProductFragment extends Fragment implements View.OnClickListener, UpListener {
+ private FragmentPublishPageBinding binding;
+ private UpModelimpl upModelimpl;
+ private List fileArrayList;
+ private ImageBean imageBean;
+ private Good goods;
+ private User user;
public PublishProductFragment() {
// Required empty public constructor
}
- /**
- * Use this factory method to create a new instance of
- * this fragment using the provided parameters.
- *
- * @param param1 Parameter 1.
- * @param param2 Parameter 2.
- * @return A new instance of fragment ShopPageFragment.
- */
- // TODO: Rename and change types and number of parameters
- public static PublishProductFragment newInstance(String param1, String param2) {
+
+ public static PublishProductFragment newInstance() {
PublishProductFragment fragment = new PublishProductFragment();
Bundle args = new Bundle();
- args.putString(ARG_PARAM1, param1);
- args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@@ -50,16 +73,137 @@ public class PublishProductFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ EventBus.getDefault().register(this);
+
+ upModelimpl = new UpModelimpl();
if (getArguments() != null) {
- mParam1 = getArguments().getString(ARG_PARAM1);
- mParam2 = getArguments().getString(ARG_PARAM2);
}
}
+ @Override
+ public void onDestroy() {
+ EventBus.getDefault().unregister(this);
+ super.onDestroy();
+ }
+
+ //通过Eventbus获取用户
+ @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
+ public void getUser(ResponseData responseData){
+ this.user = responseData.getData();
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- return inflater.inflate(R.layout.fragment_publish_page, container, false);
+ binding = FragmentPublishPageBinding.inflate(inflater, container, false);
+ View view = binding.getRoot();
+
+ binding.btnRelease.setOnClickListener(this);
+ binding.btnAddImage.setOnClickListener(this);
+// binding.
+
+ return view;
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ binding = null;
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()){
+ case R.id.btn_release:
+ Log.e("1","发布按钮点击");
+ publishGoods();
+
+ break;
+ case R.id.btn_add_image:
+ getPicture();
+ break;
+
+
+ }
+ }
+
+ //发布商品
+ private void publishGoods() {
+ goods = new Good();
+
+ goods.setAddr(binding.etAddr.getText().toString());
+ goods.setContent(binding.etContent.getText().toString());
+ Log.e("1",imageBean.getImageCode().toString());
+ if (imageBean == null){
+ ToastUtil.showMsg(getActivity(),"请先上传图片");
+ return;
+ }
+
+ goods.setImageCode(imageBean.getImageCode());
+ goods.setPrice(Integer.parseInt(binding.etPrice.getText().toString()));
+ goods.setTypeId(Integer.parseInt(binding.etGoodsType.getText().toString()));
+ goods.setTypeName(binding.etGoodsTypeName.getText().toString());
+ goods.setUserId(user.getId());
+
+ upModelimpl.addGoods(goods,this);
+
+ }
+
+ //获取相册图片
+ public void getPicture(){
+ PictureSelector.create(getActivity())
+ .openGallery(SelectMimeType.ofImage())
+ .setImageEngine(GlideEngine.createGlideEngine())
+ .isOriginalControl(true)
+ .forResult(new OnResultCallbackListener() {
+ @Override
+ public void onResult(ArrayList result) {
+ fileArrayList = new ArrayList<>();
+ for (int i = 0; i < result.size(); i++) {
+ String imgPath = result.get(i).getRealPath();
+ File file = new File(imgPath);
+
+ //参数添加
+ MultipartBody.Builder builder =
+ new MultipartBody.Builder()
+ .setType(MultipartBody.FORM);
+
+ RequestBody requestFile =
+ RequestBody.create(MediaType.parse("image/png"), file);//文件形式
+
+ builder.addFormDataPart("fileList", file.getName(), requestFile);
+ fileArrayList = builder.build().parts();
+ }
+ updateImage(fileArrayList);
+ }
+
+ @Override
+ public void onCancel() {
+
+ }
+ });
+ }
+
+ //上传
+ private void updateImage(List parts) {
+ upModelimpl.UpImage(parts,this);
+ }
+
+ @Override
+ public void upImageOnSuccess(ResponseData responseData) {
+ imageBean = responseData.getData();
+ Log.e("str",String.valueOf(imageBean.getImageCode()));
+
+
+ }
+
+ @Override
+ public void addGoodsOnSuccess(ResponseData responseData) {
+ this.goods = responseData.getData();
+ if (responseData.getCode() == 200){
+// ToastUtil.showMsg(getActivity(),"发布成功,即将跳转页面");
+ Intent intent = new Intent(getActivity(), HomePageActivity.class);
+ startActivity(intent);
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/android/bean/Good.java b/app/src/main/java/com/android/bean/Good.java
index 292a6ab..8d09151 100644
--- a/app/src/main/java/com/android/bean/Good.java
+++ b/app/src/main/java/com/android/bean/Good.java
@@ -24,9 +24,25 @@ public class Good implements Serializable {
private Integer status;
private Long tUserId;
private Long tuserId;
+ private Long userId;
private Integer typeId;
private List array;
+ public void setImageUrlList(List imageUrlList) {
+ this.imageUrlList = imageUrlList;
+ }
+
+ public Long getUserId() {
+ return userId;
+ }
+
+ public void setUserId(Long userId) {
+ this.userId = userId;
+ }
+
+ public Good() {
+ }
+
protected Good(Parcel in) {
addr = in.readString();
appKey = in.readString();
diff --git a/app/src/main/java/com/android/bean/ImageBean.java b/app/src/main/java/com/android/bean/ImageBean.java
new file mode 100644
index 0000000..666930f
--- /dev/null
+++ b/app/src/main/java/com/android/bean/ImageBean.java
@@ -0,0 +1,36 @@
+package com.android.bean;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.ArrayList;
+
+public class ImageBean {
+ @SerializedName("imageCode")
+ private Long imageCode;
+ @SerializedName("imageUrlList")
+ private ArrayList imageUrlList;
+
+ public ImageBean(Long imageCode, ArrayList imageUrlList) {
+ this.imageCode = imageCode;
+ this.imageUrlList = imageUrlList;
+ }
+
+ public ImageBean() {
+ }
+
+ public Long getImageCode() {
+ return imageCode;
+ }
+
+ public void setImageCode(Long imageCode) {
+ this.imageCode = imageCode;
+ }
+
+ public ArrayList getImageUrlList() {
+ return imageUrlList;
+ }
+
+ public void setImageUrlList(ArrayList imageUrlList) {
+ this.imageUrlList = imageUrlList;
+ }
+}
diff --git a/app/src/main/java/com/android/model/goods/GoodsHttp_interface.java b/app/src/main/java/com/android/model/goods/GoodsHttp_interface.java
index fb8df8c..e58dd9b 100644
--- a/app/src/main/java/com/android/model/goods/GoodsHttp_interface.java
+++ b/app/src/main/java/com/android/model/goods/GoodsHttp_interface.java
@@ -4,12 +4,16 @@ import com.android.bean.GoodRecords;
import com.android.bean.GoodsType;
import com.android.bean.ResponseData;
+import java.io.File;
import java.util.List;
import java.util.Map;
import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;
import retrofit2.http.Headers;
+import retrofit2.http.Multipart;
+import retrofit2.http.POST;
+import retrofit2.http.Part;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
@@ -31,4 +35,6 @@ public interface GoodsHttp_interface {
+
+
}
diff --git a/app/src/main/java/com/android/model/upload/UpHttp_interface.java b/app/src/main/java/com/android/model/upload/UpHttp_interface.java
new file mode 100644
index 0000000..01d4171
--- /dev/null
+++ b/app/src/main/java/com/android/model/upload/UpHttp_interface.java
@@ -0,0 +1,29 @@
+package com.android.model.upload;
+
+import com.android.bean.Good;
+import com.android.bean.ImageBean;
+import com.android.bean.ResponseData;
+
+import java.io.File;
+import java.util.List;
+
+import io.reactivex.rxjava3.core.Observable;
+import okhttp3.MultipartBody;
+import retrofit2.http.Body;
+import retrofit2.http.Headers;
+import retrofit2.http.Multipart;
+import retrofit2.http.POST;
+import retrofit2.http.Part;
+
+public interface UpHttp_interface {
+ @Multipart
+ @POST("tran/image/upload")
+ @Headers({"appId:b34ac21286ae45938add627b418a4871",
+ "appSecret:67526def9de11d4a64f5e80e60ed3372eea69"})
+ Observable> sendUpImage(@Part List fileList);
+
+ @POST("tran/goods/add")
+ @Headers({"appId:b34ac21286ae45938add627b418a4871",
+ "appSecret:67526def9de11d4a64f5e80e60ed3372eea69"})
+ Observable> sendAddGoods(@Body Good goods);
+}
diff --git a/app/src/main/java/com/android/model/upload/UpListener.java b/app/src/main/java/com/android/model/upload/UpListener.java
new file mode 100644
index 0000000..fa46958
--- /dev/null
+++ b/app/src/main/java/com/android/model/upload/UpListener.java
@@ -0,0 +1,13 @@
+package com.android.model.upload;
+
+import com.android.bean.Good;
+import com.android.bean.ImageBean;
+import com.android.bean.ResponseData;
+
+import java.io.File;
+import java.util.List;
+
+public interface UpListener {
+ void upImageOnSuccess(ResponseData responseData);
+ void addGoodsOnSuccess(ResponseData responseData);
+}
diff --git a/app/src/main/java/com/android/model/upload/UpModel.java b/app/src/main/java/com/android/model/upload/UpModel.java
new file mode 100644
index 0000000..94dffc3
--- /dev/null
+++ b/app/src/main/java/com/android/model/upload/UpModel.java
@@ -0,0 +1,13 @@
+package com.android.model.upload;
+
+import com.android.bean.Good;
+
+import java.util.List;
+
+import okhttp3.MultipartBody;
+
+public interface UpModel {
+ void UpImage (List parts, final UpListener upListener);
+ void addGoods (Good good, final UpListener upListener);
+
+}
diff --git a/app/src/main/java/com/android/model/upload/UpModelimpl.java b/app/src/main/java/com/android/model/upload/UpModelimpl.java
new file mode 100644
index 0000000..35982b9
--- /dev/null
+++ b/app/src/main/java/com/android/model/upload/UpModelimpl.java
@@ -0,0 +1,101 @@
+package com.android.model.upload;
+
+import android.util.Log;
+
+import com.android.bean.Good;
+import com.android.bean.ImageBean;
+import com.android.bean.ResponseData;
+import com.android.utils.constraint.Constants;
+
+import java.io.File;
+import java.util.List;
+
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import okhttp3.MultipartBody;
+import retrofit2.Retrofit;
+import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+public class UpModelimpl implements UpModel{
+
+ @Override
+ public void UpImage(List parts,final UpListener upListener) {
+ Retrofit retrofit = new Retrofit.Builder()
+ .baseUrl(Constants.BASE_URL)
+ .addConverterFactory(GsonConverterFactory.create())
+ .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
+ .build();
+
+ UpHttp_interface anInterface = retrofit.create(UpHttp_interface.class);
+ Observable> observable = anInterface.sendUpImage(parts);
+
+ observable.observeOn(Schedulers.io())
+ .subscribeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+
+
+ }
+
+ @Override
+ public void onNext(@NonNull ResponseData listResponseData) {
+ upListener.upImageOnSuccess(listResponseData);
+ Log.e("图片返回",listResponseData.getMsg());
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("onerror",e.toString());
+ }
+
+ @Override
+ public void onComplete() {
+
+ }
+ });
+
+ }
+
+ @Override
+ public void addGoods(Good good, UpListener upListener) {
+ Retrofit retrofit = new Retrofit.Builder()
+ .baseUrl(Constants.BASE_URL)
+ .addConverterFactory(GsonConverterFactory.create())
+ .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
+ .build();
+
+ UpHttp_interface httpInterface = retrofit.create(UpHttp_interface.class);
+ Observable> observable = httpInterface.sendAddGoods(good);
+
+ observable.observeOn(Schedulers.io())
+ .subscribeOn(AndroidSchedulers.mainThread())
+ .subscribe(new Observer>() {
+ @Override
+ public void onSubscribe(@NonNull Disposable d) {
+
+ }
+
+ @Override
+ public void onNext(@NonNull ResponseData goodResponseData) {
+ Log.e("发布商品",goodResponseData.getMsg());
+ upListener.addGoodsOnSuccess(goodResponseData);
+ }
+
+ @Override
+ public void onError(@NonNull Throwable e) {
+ Log.e("1",e.toString());
+ }
+
+ @Override
+ public void onComplete() {
+
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/com/android/utils/FileUtil.java b/app/src/main/java/com/android/utils/FileUtil.java
new file mode 100644
index 0000000..1cedad7
--- /dev/null
+++ b/app/src/main/java/com/android/utils/FileUtil.java
@@ -0,0 +1,171 @@
+package com.android.utils;
+
+
+
+import android.content.ContentUris;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.provider.DocumentsContract;
+import android.provider.MediaStore;
+
+import androidx.annotation.RequiresApi;
+
+import java.io.File;
+
+/**
+ * 文件工具类
+ */
+public class FileUtil {
+
+
+ /**
+ * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使
+ */
+ @RequiresApi(api = Build.VERSION_CODES.KITKAT)
+ public static String getPath(final Context context, final Uri uri) {
+
+ final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+
+ // DocumentProvider
+ if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
+ // ExternalStorageProvider
+ //一些三方的文件浏览器会进入到这个方法中,例如ES
+ //QQ文件管理器不在此列
+ if (isExternalStorageDocument(uri)) {
+ final String docId = DocumentsContract.getDocumentId(uri);
+ final String[] split = docId.split(":");
+ final String type = split[0];
+
+ if ("primary".equalsIgnoreCase(type)) {
+ return Environment.getExternalStorageDirectory() + "/" + split[1];
+ }
+ }
+ // DownloadsProvider
+ else if (isDownloadsDocument(uri)) {
+ final String id = DocumentsContract.getDocumentId(uri);
+ // 不同系统获取的id开头可能不一样,在这后面便是真实的地址
+ if (id.startsWith("msf:")) {
+ return id.replaceFirst("msf:", "");
+ }
+ final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
+
+ return getDataColumn(context, contentUri, null, null);
+ }
+ // MediaProvider
+ else if (isMediaDocument(uri)) {
+ final String docId = DocumentsContract.getDocumentId(uri);
+ final String[] split = docId.split(":");
+ final String type = split[0];
+
+ Uri contentUri = null;
+ if ("image".equals(type)) {
+ contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
+ } else if ("video".equals(type)) {
+ contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
+ } else if ("audio".equals(type)) {
+ contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
+ }
+
+ final String selection = "_id=?";
+ final String[] selectionArgs = new String[]{split[1]};
+
+ return getDataColumn(context, contentUri, selection, selectionArgs);
+ }
+ } else if ("content".equalsIgnoreCase(uri.getScheme())) {// MediaStore (and general)
+ // Return the remote address
+ if (isGooglePhotosUri(uri))
+ return uri.getLastPathSegment();
+
+
+ if (isQQMediaDocument(uri)) {
+ String path = uri.getPath();
+ File fileDir = Environment.getExternalStorageDirectory();
+ File file = new File(fileDir, path.substring("/QQBrowser".length(), path.length()));
+ return file.exists() ? file.toString() : null;
+ }
+
+ return getDataColumn(context, uri, null, null);
+ } else if ("file".equalsIgnoreCase(uri.getScheme())) {// File
+
+ return uri.getPath();
+ }
+ return null;
+ }
+
+ /**
+ * Get the value of the data column for this Uri. This is useful for
+ * MediaStore Uris, and other file-based ContentProviders.
+ *
+ * @param context The context.
+ * @param uri The Uri to query.
+ * @param selection (Optional) Filter used in the query.
+ * @param selectionArgs (Optional) Selection arguments used in the query.
+ * @return The value of the _data column, which is typically a file path.
+ */
+ public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
+
+ Cursor cursor = null;
+ final String column = MediaStore.MediaColumns.DATA;
+ final String[] projection = {column};
+ try {
+ cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
+ if (cursor != null && cursor.moveToFirst()) {
+ final int column_index = cursor.getColumnIndexOrThrow(column);
+ return cursor.getString(column_index);
+ }
+ } finally {
+ if (cursor != null)
+ cursor.close();
+ }
+ return null;
+ }
+
+
+ /**
+ * @param uri The Uri to check.
+ * @return Whether the Uri authority is ExternalStorageProvider.
+ */
+ public static boolean isExternalStorageDocument(Uri uri) {
+ return "com.android.externalstorage.documents".equals(uri.getAuthority());
+ }
+
+ /**
+ * @param uri The Uri to check.
+ * @return Whether the Uri authority is DownloadsProvider.
+ */
+ public static boolean isDownloadsDocument(Uri uri) {
+ return "com.android.providers.downloads.documents".equals(uri.getAuthority());
+ }
+
+ /**
+ * @param uri The Uri to check.
+ * @return Whether the Uri authority is MediaProvider.
+ */
+ public static boolean isMediaDocument(Uri uri) {
+ return "com.android.providers.media.documents".equals(uri.getAuthority());
+ }
+
+
+ /**
+ * 使用第三方qq文件管理器打开
+ *
+ * @param uri
+ * @return
+ */
+ public static boolean isQQMediaDocument(Uri uri) {
+ return "com.tencent.mtt.fileprovider".equals(uri.getAuthority());
+ }
+
+ /**
+ * @param uri The Uri to check.
+ * @return Whether the Uri authority is Google Photos.
+ */
+ public static boolean isGooglePhotosUri(Uri uri) {
+ return "com.google.android.apps.photos.content".equals(uri.getAuthority());
+ }
+
+}
+
diff --git a/app/src/main/java/com/android/utils/GlideEngine.java b/app/src/main/java/com/android/utils/GlideEngine.java
new file mode 100644
index 0000000..ee0526e
--- /dev/null
+++ b/app/src/main/java/com/android/utils/GlideEngine.java
@@ -0,0 +1,156 @@
+package com.android.utils;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.R;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.resource.bitmap.CenterCrop;
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
+import com.bumptech.glide.request.target.CustomTarget;
+import com.bumptech.glide.request.transition.Transition;
+import com.luck.picture.lib.engine.ImageEngine;
+import com.luck.picture.lib.interfaces.OnCallbackListener;
+import com.luck.picture.lib.utils.ActivityCompatHelper;
+
+
+/**
+ * @author:luck
+ * @date:2019-11-13 17:02
+ * @describe:Glide加载引擎
+ */
+public class GlideEngine implements ImageEngine {
+
+ /**
+ * 加载图片
+ *
+ * @param context 上下文
+ * @param url 资源url
+ * @param imageView 图片承载控件
+ */
+ @Override
+ public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return;
+ }
+ Glide.with(context)
+ .load(url)
+ .into(imageView);
+ }
+
+ /**
+ * 加载指定url并返回bitmap
+ *
+ * @param context 上下文
+ * @param url 资源url
+ * @param maxWidth 资源最大加载尺寸
+ * @param maxHeight 资源最大加载尺寸
+ * @param call 回调接口
+ */
+ @Override
+ public void loadImageBitmap(@NonNull Context context, @NonNull String url, int maxWidth, int maxHeight, OnCallbackListener call) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return;
+ }
+ Glide.with(context)
+ .asBitmap()
+ .override(maxWidth, maxHeight)
+ .load(url)
+ .into(new CustomTarget() {
+
+ @Override
+ public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition super Bitmap> transition) {
+ if (call != null) {
+ call.onCall(resource);
+ }
+ }
+
+ @Override
+ public void onLoadFailed(@Nullable Drawable errorDrawable) {
+ if (call != null) {
+ call.onCall(null);
+ }
+ }
+
+ @Override
+ public void onLoadCleared(@Nullable Drawable placeholder) {
+
+ }
+
+ });
+ }
+
+ /**
+ * 加载相册目录封面
+ *
+ * @param context 上下文
+ * @param url 图片路径
+ * @param imageView 承载图片ImageView
+ */
+ @Override
+ public void loadAlbumCover(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return;
+ }
+ Glide.with(context)
+ .asBitmap()
+ .load(url)
+ .override(180, 180)
+ .sizeMultiplier(0.5f)
+ .transform(new CenterCrop(), new RoundedCorners(8))
+ .placeholder(R.drawable.custom_rc_divider)
+ .into(imageView);
+ }
+
+
+ /**
+ * 加载图片列表图片
+ *
+ * @param context 上下文
+ * @param url 图片路径
+ * @param imageView 承载图片ImageView
+ */
+ @Override
+ public void loadGridImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
+ if (!ActivityCompatHelper.assertValidRequest(context)) {
+ return;
+ }
+ Glide.with(context)
+ .load(url)
+ .override(200, 200)
+ .centerCrop()
+ .placeholder(R.drawable.custom_rc_divider)
+ .into(imageView);
+ }
+
+ @Override
+ public void pauseRequests(Context context) {
+ Glide.with(context).pauseRequests();
+ }
+
+ @Override
+ public void resumeRequests(Context context) {
+ Glide.with(context).resumeRequests();
+ }
+
+ private GlideEngine() {
+ }
+
+ private static GlideEngine instance;
+
+ public static GlideEngine createGlideEngine() {
+ if (null == instance) {
+ synchronized (GlideEngine.class) {
+ if (null == instance) {
+ instance = new GlideEngine();
+ }
+ }
+ }
+ return instance;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/android/utils/watcher/MyWatcher.java b/app/src/main/java/com/android/utils/watcher/MyWatcher.java
index d89910d..94d348c 100644
--- a/app/src/main/java/com/android/utils/watcher/MyWatcher.java
+++ b/app/src/main/java/com/android/utils/watcher/MyWatcher.java
@@ -23,6 +23,15 @@ public class MyWatcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ //当号码大于11位时显示按钮
+ if(s.length()>=11){
+ getVerificationCode.setEnabled(true);
+ //注册按钮
+ registerButton.setOnClickListener(loginActivity);
+ }
+ else {
+ getVerificationCode.setEnabled(false);
+ }
}
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
index 4570e1e..de69f38 100644
--- a/app/src/main/res/layout/activity_login.xml
+++ b/app/src/main/res/layout/activity_login.xml
@@ -71,6 +71,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBaseline="@id/bt_getCode"
+ android:text="936760"
android:layout_gravity="center" />
diff --git a/app/src/main/res/layout/fragment_publish_page.xml b/app/src/main/res/layout/fragment_publish_page.xml
index f663d13..1473800 100644
--- a/app/src/main/res/layout/fragment_publish_page.xml
+++ b/app/src/main/res/layout/fragment_publish_page.xml
@@ -12,17 +12,17 @@
android:orientation="vertical"
android:padding="10dp">
@@ -33,16 +33,73 @@
android:background="@drawable/addimageiv"
android:layout_width="100dp"
android:layout_height="100dp"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-