//权限<!--网络权限--> <uses-permission android:name="android.permission.INTERNET"/> <!--读写SD卡权限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
//依赖
//Retrofit依赖
compile 'com.squareup.retrofit2:retrofit:2.3.0'
//数据解析
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
//关联RXJava
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
//RxJava依赖
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
compile 'org.greenrobot:greendao:3.2.2' // add library
//Shang_Bean
public class Shang_Bean<T> {
private String msg;
private String code;
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
//User_Bean
public class User_Bean { private Object age; private String appkey; private String appsecret; private String createtime; private Object email; private Object fans; private Object follow; private Object gender; private String icon; private Object latitude; private Object longitude; private String mobile; private Object money; private String nickname; private String password; private Object praiseNum; private String token; private String uid; private Object userId; private String username; public Object getAge() { return age; } public void setAge(Object age) { this.age = age; } public String getAppkey() { return appkey; } public void setAppkey(String appkey) { this.appkey = appkey; } public String getAppsecret() { return appsecret; } public void setAppsecret(String appsecret) { this.appsecret = appsecret; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public Object getEmail() { return email; } public void setEmail(Object email) { this.email = email; } public Object getFans() { return fans; } public void setFans(Object fans) { this.fans = fans; } public Object getFollow() { return follow; } public void setFollow(Object follow) { this.follow = follow; } public Object getGender() { return gender; } public void setGender(Object gender) { this.gender = gender; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public Object getLatitude() { return latitude; } public void setLatitude(Object latitude) { this.latitude = latitude; } public Object getLongitude() { return longitude; } public void setLongitude(Object longitude) { this.longitude = longitude; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public Object getMoney() { return money; } public void setMoney(Object money) { this.money = money; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Object getPraiseNum() { return praiseNum; } public void setPraiseNum(Object praiseNum) { this.praiseNum = praiseNum; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public Object getUserId() { return userId; } public void setUserId(Object userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
//My_Url
public class My_Url { public static final String SHANG="http://120.27.23.105/"; }
//Shang_Viewpublic interface Shang_View { void onSuccess(String msg); }
//Shang_Model
public class Shang_Model { public void loginUpload(String phone, String pwd, final File file, final Shang_View shang_view) { My_APi my_aPi = RetrofitHelper.getRetrofit(My_Url.SHANG).create(My_APi.class); my_aPi.login(phone,pwd) .flatMap(new Function<Shang_Bean<User_Bean>, ObservableSource<Shang_Bean>>() { @Override public ObservableSource<Shang_Bean> apply(@NonNull Shang_Bean<User_Bean> Shang_bean) throws Exception { if(Shang_bean!=null){ User_Bean data = Shang_bean.getData(); if(data!=null){ RequestBody uid = RequestBody.create(MediaType.parse("multipart/form-data"), data.getUid()); //TOKEN RequestBody token = RequestBody.create(MediaType.parse("multipart/form-data"), data.getToken()); RequestBody requestImgFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); // 创建MultipartBody.Part,用于封装文件数据 MultipartBody.Part requestImgPart = MultipartBody.Part.createFormData("file", file.getName(), requestImgFile); return RetrofitHelper.getRetrofit(My_Url.SHANG).create(My_APi.class).getShang(uid,requestImgPart); } } return Observable.empty(); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Shang_Bean>() { @Override public void accept(Shang_Bean shang_bean) throws Exception { shang_view.onSuccess(shang_bean.getMsg()); } }); } }
//CommonParamsInterceptor
//My_APipublic class CommonParamsInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); HttpUrl httpUrl = request .url() .newBuilder() .addQueryParameter("source", "android") .build(); Request requestNew = request .newBuilder() .url(httpUrl) .build(); return chain.proceed(requestNew); } }
public interface My_APi { //需要用户登录获得token值的时候需要登录 @FormUrlEncoded @POST("user/login") Observable<Shang_Bean<User_Bean>> login(@Field("mobile") String mobile, @Field("password") String password); @Multipart @POST("file/upload") Observable<Shang_Bean> getShang(@Part("uid") RequestBody uid, @Part MultipartBody.Part img_part); }
//RetrofitHelper
public class RetrofitHelper {
public static Retrofit retrofit;
public static Retrofit getRetrofit(String url) {
if (retrofit == null) {
synchronized (RetrofitHelper.class) {
if (retrofit == null) {
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new CommonParamsInterceptor())
.build();
retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
}
}
return retrofit;
}
}
//Main
public class MainActivity extends AppCompatActivity implements Shang_View{
private String path;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
path = Environment.getExternalStorageDirectory() + "/head.jpg";
}
//BUtton点击事件
/**
* 相机拍照
*
* @param view
*/ public void camera_pic(View view) {
// 这个出捕获图片的常量值
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 设置图片输出位置; 输出到制定的uri路径上;
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(path)));
// 设置请求码
startActivityForResult(intent, 100);
}
/**
* 相册选取照片
*
* @param view
*/
public void picCollection_pic(View view) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 101);
}
//Intent回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//照相机
if (requestCode == 100 && resultCode == RESULT_OK) {
crop(Uri.fromFile(new File(path)));
//从相册直接选取照片回调
} else if (requestCode == 101 && resultCode == RESULT_OK) {
Uri uri = data.getData();
crop(uri);
//剪切回调
} else if (requestCode == 102 && resultCode == RESULT_OK) {
//这个参数data,是固定写法
Bitmap bitmap = data.getParcelableExtra("data");
Uri uri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null,null));
//uri类型装换为String
String realPathFromURI = getRealPathFromURI(uri);
//再变为file类型
File file = new File(realPathFromURI);
Shang_Model shang_model = new Shang_Model();
shang_model.loginUpload("13552663511", "123456", file,this);
}
}
/**
* 剪裁是系统提供的一个应用,我们需要用intent
*
* @param uri
*/
public void crop(Uri uri) {
// 隐式启动, 里面传的是action
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputX", 250);
intent.putExtra("outputY", 250);
intent.putExtra("outputFormat", "JPEG");// 图片格式
intent.putExtra("noFaceDetection", false);// 取消人脸识别
// 设置剪裁后是否返回数据
intent.putExtra("return-data", true);
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
startActivityForResult(intent, 102);
}
//传入图片uri地址变为String
private String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(MainActivity.this, contentUri, proj, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
@Override
public void onSuccess(String msg) {
Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT).show();
}
}
//Main布局文件
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="wld.bawei.com.myshangchuangtouxiang.MainActivity">
<Button
android:text="拍照"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="camera_pic"
/>
<TextView
android:text="选取"
android:onClick="picCollection_pic"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>