admin
2021-08-19 6f07cf3ce7ccb37911f5c755b7833732fb8eee64
功能完善
14个文件已修改
1个文件已添加
558 ■■■■■ 已修改文件
app/res/layout/mvideo_activity.xml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/res/layout/settings_activity.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/res/layout/video_detail_activity.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/ui/common/FollowAdapter2.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/ui/login/PersonInfoActivity.java 151 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/ui/main/CategoryFragment.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/ui/main/HomeFragment.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/ui/main/MineFragment.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/ui/mine/SettingsActivity.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/ui/recommend/RecommendFragment.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/ui/recommend/RecommendNewAdapter.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/util/HanJuConstant.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/util/PhotoCrop.java 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/util/UserUtil.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/com/hanju/video/app/util/browser/BWJavaInterface.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/res/layout/mvideo_activity.xml
@@ -5,11 +5,11 @@
    android:background="@color/white"
    android:orientation="vertical">
<!--    <View-->
<!--        android:id="@+id/v_status_bar"-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="15dp"-->
<!--        android:background="@color/top_bar_color" />-->
    <!--    <View-->
    <!--        android:id="@+id/v_status_bar"-->
    <!--        android:layout_width="match_parent"-->
    <!--        android:layout_height="15dp"-->
    <!--        android:background="@color/top_bar_color" />-->
    <LinearLayout
        android:layout_width="match_parent"
@@ -32,6 +32,7 @@
                android:drawableLeft="@drawable/ic_back_two"
                android:drawablePadding="5dp"
                android:gravity="center"
                android:layout_gravity="center_vertical"
                android:padding="8dp" />
        </FrameLayout>
@@ -49,12 +50,13 @@
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_weight="1">
                android:layout_weight="1"
                android:visibility="gone">
                <ImageView
                    android:id="@+id/iv_recommend_watch_history"
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_margin="8dp"
                    android:scaleType="fitCenter"
@@ -63,10 +65,10 @@
            <FrameLayout
                android:layout_width="0dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_weight="1">
                android:paddingRight="10dp"
                android:layout_gravity="center">
                <ImageView
                    android:id="@+id/iv_activity_main_search"
app/res/layout/settings_activity.xml
@@ -94,6 +94,7 @@
                android:visibility="gone" />
            <TextView
                android:visibility="gone"
                style="@style/TextBlackMedium"
                android:layout_width="wrap_content"
                android:layout_height="30dp"
@@ -127,7 +128,7 @@
                    android:checked="true" />
            </RelativeLayout>
            <View style="@style/settingItemCutLineStyle"></View>
            <View android:visibility="gone" style="@style/settingItemCutLineStyle"></View>
            <RelativeLayout
                style="@style/settingItemBgStyle">
@@ -260,7 +261,7 @@
                    android:gravity="center_vertical" />
            </RelativeLayout>
            <View style="@style/settingItemCutLineStyle"></View>
            <View android:visibility="gone" style="@style/settingItemCutLineStyle"></View>
            <RelativeLayout
                android:id="@+id/rl_privacy_policy"
app/res/layout/video_detail_activity.xml
@@ -207,6 +207,7 @@
                <ImageView
                    android:visibility="gone"
                    android:id="@+id/iv_share"
                    android:layout_width="wrap_content"
                    android:layout_height="20dp"
app/src/com/hanju/video/app/ui/common/FollowAdapter2.java
@@ -11,6 +11,9 @@
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.hanju.video.app.BasicTextHttpResponseHandler;
import com.hanju.video.app.HttpApiUtil;
import com.hanju.video.app.util.UserUtil;
import com.lcjian.library.util.common.StringUtils;
import com.hanju.video.app.entity.Attention;
import com.hanju.video.app.entity.Follow;
@@ -18,6 +21,9 @@
import com.hanju.video.app.util.GlideCircleTransform;
import com.hanju.video.app.util.TimeUtil;
import com.hanju.video.app.R;
import org.apache.http.Header;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
@@ -91,11 +97,22 @@
                if (info.isAttention()) {
                    info.setAttention(false);
                    holder1.tv_cancle_follow.setText("追剧");
                    removeList.add(info);
//                    removeList.add(info);
                    HttpApiUtil.cancelAttention(mContext, UserUtil.getUid(mContext), UserUtil.getLoginUid(mContext), info.getVideoInfo().getId() + "", new BasicTextHttpResponseHandler() {
                        @Override
                        public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception {
                            if (jsonObject.optBoolean("IsPost")) {
                                mList.remove(info);
                                notifyDataSetChanged();
                            }
                        }
                    });
                } else {
                    info.setAttention(true);
                    holder1.tv_cancle_follow.setText("已追剧");
                    removeList.remove(info);
//                    removeList.remove(info);
                }
            }
        });
app/src/com/hanju/video/app/ui/login/PersonInfoActivity.java
@@ -1,28 +1,40 @@
package com.hanju.video.app.ui.login;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
import com.androidquery.AQuery;
import com.bumptech.glide.Glide;
import com.hanju.video.app.ui.mine.BrowserActivity;
import com.hanju.video.app.util.PhotoCrop;
import com.lcjian.library.util.Environment;
import com.lcjian.library.util.SingleToast;
import com.lcjian.library.util.common.StringUtils;
@@ -47,6 +59,9 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
/**
 * Created by weikou2015 on 2016/10/27.
@@ -140,26 +155,81 @@
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            Bitmap bm = null;
            bm = SelectPicUtil.onActivityResult(this, requestCode,
                    resultCode, data, imgWidth, imgHeight, imgWidth,
                    imgHeight);
            if (bm != null) {
                if (bm.getByteCount() / 1024 > maxSize) {
                    bm = compressImage(bm);
            //从相册中选择而来
            if (requestCode == 1001 && data != null) {
                Uri selectedImage = data.getData();
                startPhotoZoom(selectedImage);//系统剪裁
            } else if (requestCode == 1002 && data != null) {
                if (uriClipUri != null) {
                    //图库
                    PhotoCrop crop = new PhotoCrop();//初始化 图片压缩
                    File f = new File(uriClipUri.getPath());//获取图片
                    Bitmap bitmap = crop.compressPhto(f);
                    if (crop.compressPhto(f, false)) {//压缩并保存成功
                        if (bitmap != null) {
                            if (bitmap.getByteCount() / 1024 > maxSize) {
                                bitmap = compressImage(bitmap);
                            }
                            String path = saveBitmapTofile(bitmap);
                            final File file = new File(path);
                            if (!file.exists()) {
                                return;
                            }
                            imgBase64 = bitmapToBase64(bitmap);
                            Log.i("mresult", "图片路劲为:" + path + "----requestcode:" + requestCode);
                            Glide.with(PersonInfoActivity.this).load(file).transform(new GlideCircleTransform(PersonInfoActivity.this)).into(iv_portrait);
                        }
                    }
                }
                String path = saveBitmapTofile(bm);
                final File file = new File(path);
                if (!file.exists()) {
                    return;
                }
                imgBase64 = bitmapToBase64(bm);
                Log.i("mresult", "图片路劲为:" + path + "----requestcode:" + requestCode);
                Glide.with(PersonInfoActivity.this).load(file).transform(new GlideCircleTransform(PersonInfoActivity.this)).into(iv_portrait);
            }
        }
    }
    private Uri uriClipUri;//剪裁图片路径
    /**
     * 获取相册图片
     *
     * @param uri
     */
    public void startPhotoZoom(Uri uri) {
        File storageDir = new File(android.os.Environment.getExternalStorageDirectory().getPath() + "/FLQImg/");
        if (!storageDir.exists()) {//没有文件夹则创建
            storageDir.mkdir();
        }
        //com.android.camera.action.CROP,这个action是调用系统自带的图片裁切功能
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");//裁剪的图片uri和图片类型
        intent.putExtra("crop", "true");//设置允许裁剪,如果不设置,就会跳过裁剪的过程,还可以设置putExtra("crop", "circle")
        if (Build.MANUFACTURER.equals("HUAWEI")) { //华为特殊处理 不然会显示圆
            intent.putExtra("aspectX", 9998);
            intent.putExtra("aspectY", 9999);
        } else {
            intent.putExtra("aspectX", 1);//裁剪框的 X 方向的比例,需要为整数
            intent.putExtra("aspectY", 1);//裁剪框的 Y 方向的比例,需要为整数
        }
        intent.putExtra("outputX", 250);//返回数据的时候的X像素大小。
        intent.putExtra("outputY", 250);//返回数据的时候的Y像素大小。
        //裁剪时是否保留图片的比例,这里的比例是1:1
        intent.putExtra("scale", true);
        //是否是圆形裁剪区域,设置了也不一定有效
        intent.putExtra("circleCrop", false);
        //uritempFile为Uri类变量,实例化uritempFile
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //如果是7.0的相册
            //设置裁剪的图片地址Uri
            uriClipUri = Uri.parse("file://" + "/" + android.os.Environment.getExternalStorageDirectory().getPath() + "/FLQImg/" + "clip.jpg");
        } else {
            uriClipUri = Uri.parse("file://" + "/" + android.os.Environment.getExternalStorageDirectory().getPath() + "/FLQImg/" + "clip.jpg");
        }
        //Android 对Intent中所包含数据的大小是有限制的,一般不能超过 1M,否则会使用缩略图 ,所以我们要指定输出裁剪的图片路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uriClipUri);
        intent.putExtra("return-data", false);//是否将数据保留在Bitmap中返回
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//输出格式,一般设为Bitmap格式及图片类型
        intent.putExtra("noFaceDetection", false);//人脸识别功能
        startActivityForResult(intent, 1002);//裁剪完成的标识
    }
    private String bitmapToBase64(Bitmap bitmap) {
@@ -238,6 +308,22 @@
        return bitmap;
    }
    // 判断权限集合 是否授权 false授权 true未授权
    public boolean lacksPermissions(String... permissions) {
        for (String permission : permissions) {
            if (lacksPermission(permission)) {
                return true;
            }
        }
        return false;
    }
    // 判断是否缺少权限
    private boolean lacksPermission(String permission) {
        //权限未授权
        return ContextCompat.checkSelfPermission(getApplicationContext(), permission) == PackageManager.PERMISSION_DENIED;
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
@@ -245,7 +331,12 @@
                finish();
                break;
            case R.id.ll_portrait_select:
                SelectPicUtil.getByAlbum(PersonInfoActivity.this);
                if (lacksPermissions(Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) { //存储权限未开启
                    ActivityCompat.requestPermissions(PersonInfoActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 10023);
                    return;
                }
                popwindow_img();//选择相册
                break;
            case R.id.ll_nickName:
                getNickName();
@@ -269,6 +360,30 @@
        }
    }
    /**
     * 从相册选择 图片
     */
    private void popwindow_img() {
        // 打开系统图库选择图片
        Intent picture = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        //解决手机找不到activity 方案一 检测裁是否有对应的app(选择了方案二 方案一占时屏蔽)
//                PackageManager packageManager = getPackageManager();
//                List<ResolveInfo> applist = packageManager.queryIntentActivities(picture, 0);
//                if (applist == null || applist.isEmpty()) {
//                    Toast.makeText(MyInfoActivity.this, "no activity", Toast.LENGTH_SHORT).show();
//                    return;
//                }
        //解决手机找不到activity 方案二 抛异常
        try {
            startActivityForResult(picture, 1001);
        } catch (ActivityNotFoundException exception) {
            Toast.makeText(this, "no activity", Toast.LENGTH_SHORT).show();
        }
    }
    /**
     * 上传个人信息
     */
app/src/com/hanju/video/app/ui/main/CategoryFragment.java
@@ -303,13 +303,13 @@
                int minStart = index - 4;
                if (minStart % 3 == 0) {
                    outRect.left = 0;
                    outRect.right = 3 * minWidth;
                    outRect.right = 4 * minWidth;
                } else if (minStart % 3 == 1) {
                    outRect.right = 3 * minWidth;
                    outRect.left = 3 * minWidth;
                    outRect.right = 2 * minWidth;
                    outRect.left = 2 * minWidth;
                } else if (minStart % 3 == 2) {
                    outRect.right = 0;
                    outRect.left = 3 * minWidth;
                    outRect.left = 4 * minWidth;
                }
                outRect.top = 3 * minWidth;
            }
app/src/com/hanju/video/app/ui/main/HomeFragment.java
@@ -180,6 +180,11 @@
                pager.getContext());
        indicator.setViewPager(pager, 0);
        fl_indicator.addView(indicator);
        if (categories.size() > 1) {
            fl_indicator.setVisibility(View.VISIBLE);
        } else {
            fl_indicator.setVisibility(View.GONE);
        }
        getHotSearch();
        getCategories();
    }
@@ -239,6 +244,13 @@
                                    }.getType());
                            categories.addAll(list);
                            if (categories.size() > 1) {
                                fl_indicator.setVisibility(View.VISIBLE);
                            } else {
                                fl_indicator.setVisibility(View.GONE);
                            }
                            adapter.notifyDataSetChanged();
                            indicator.notifyDataSetChanged();
app/src/com/hanju/video/app/ui/main/MineFragment.java
@@ -335,7 +335,8 @@
        } else {
            rv_watch_history.getAdapter().notifyDataSetChanged();
        }
        if (UserUtil.getLoginUid(getContext()) != null) {
        String loginUid = UserUtil.getLoginUid(getContext());
        if (!StringUtils.isEmpty(loginUid)) {
            HttpApiUtil.getPersonInfo(getContext(), UserUtil.getUid(getContext()), UserUtil.getLoginUid(getContext()), new BasicTextHttpResponseHandler() {
                @Override
                public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception {
@@ -347,6 +348,19 @@
                        String sign = data.optString("Sign");
                        if (!StringUtils.isEmpty(sign))
                            tv_desc.setText(sign);
                    } else {
                        String msg = jsonObject.optString("Error");
                        Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();
                        if (msg != null && msg.contains("注销")) {
                            Editor edit = getContext().getSharedPreferences("user",
                                    Context.MODE_PRIVATE).edit();
                            edit.putString("LoginUid", "");
                            edit.putBoolean("PushType", false);
                            edit.commit();
                            UserUtil.logout(getContext());
                            MineFragment.isLogin = false;// 改为未登录状态
                            initLoginInfo();
                        }
                    }
                }
            });
app/src/com/hanju/video/app/ui/mine/SettingsActivity.java
@@ -295,10 +295,10 @@
            }
            break;
            case R.id.rl_about_us: {
                Intent intent = new Intent(this, BrowserActivity.class);
                intent.putExtra("url", "http://bwweb.yeshitv.com/abountOur/index.html");
                Intent intent = new Intent(this, AboutUsActivity.class);
                startActivity(intent);
            }
            break;
            case R.id.rl_my_info: {
                Intent intent = new Intent(this, PersonInfoActivity.class);
app/src/com/hanju/video/app/ui/recommend/RecommendFragment.java
@@ -80,8 +80,10 @@
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade;
@@ -131,6 +133,8 @@
    private View loading;
    private int totalCount = 0;
    private Set<String> emptyHomeTypes = new HashSet<>();
    public static Fragment newInstance(HomeNav type, String position) {
        if (Integer.parseInt(position) < 2) {
@@ -314,7 +318,7 @@
                int last = manager.findLastVisibleItemPosition();
                int total = manager.getItemCount();
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    if ((!isLoad) && last == total - 1 && mHomeTypes.size() > 0 && totalCount > mHomeTypes.size()) {
                    if ((!isLoad) && last == total - 1 && mHomeTypes.size() > 0 && totalCount > mHomeTypes.size() + (emptyHomeTypes==null?0: emptyHomeTypes.size())) {
                        Log.i("RecommendFragment", "加载更多");
                        page++;
                        isLoad = true;
@@ -894,6 +898,11 @@
        SharedPreferences preferences = context.getSharedPreferences(
                "user", Context.MODE_PRIVATE);
        String uid = preferences.getString("uid", "");
        if (page == 1) {
            if (emptyHomeTypes == null)
                emptyHomeTypes = new HashSet<>();
            emptyHomeTypes.clear();
        }
        HttpApiUtil.getHomeType(context, uid, type.getId(), type.getDataKey(), page, 5,
                new BasicTextHttpResponseHandler() {
                    @Override
@@ -946,7 +955,10 @@
                                }
                                type.setItemTypeList(itemList);
                                if (!type.getName().equalsIgnoreCase("美女"))
                                    homeTypes.add(type);
                                    if (type.getHomeVideoList() != null && type.getHomeVideoList().size() > 0)
                                        homeTypes.add(type);
                                    else
                                        emptyHomeTypes.add(type.getId());
                            }
                            if (page == 1) {
app/src/com/hanju/video/app/ui/recommend/RecommendNewAdapter.java
@@ -203,6 +203,9 @@
                    VideoAlbumAdapter adapter = new VideoAlbumAdapter(mContext, homeType.getVideoInfoList());
                    adapter.initRecyclerViewDisplayWidthRow1(holder.rv_content);
                    holder.rv_content.setAdapter(adapter);
                    holder.view.setVisibility(View.VISIBLE);
                }else{
                    holder.view.setVisibility(View.GONE);
                }
            } else {
                VideoColumn2Adapter adapter = null;
@@ -213,8 +216,13 @@
                    adapter.initRecyclerViewDisplayWidthColumn3(holder.rv_content);
                else
                    adapter.initRecyclerViewDisplayWidthRow1(holder.rv_content);
                if (homeType.getVideoInfoList() != null && homeType.getVideoInfoList().size() > 0)
                if (homeType.getVideoInfoList() != null && homeType.getVideoInfoList().size() > 0) {
                    holder.view.setVisibility(View.VISIBLE);
                    holder.rv_content.setAdapter(adapter);
                } else {
                    holder.rv_content.setAdapter(null);
                    holder.view.setVisibility(View.GONE);
                }
            }
app/src/com/hanju/video/app/util/HanJuConstant.java
@@ -14,8 +14,8 @@
    public static final String USER_AGREEMENT = "http://bwapp.flqapp.com:8089/BuWan/api_control_ios.jsp";
    public static final String PRIVACY_POLICY = "http://bwapp.flqapp.com:8089/BuWan/user_protocol.jsp";
//    public static final String HOST = "http://bwapp.flqapp.com:8089";//正式上线版本
    public static final String HOST = "http://192.168.3.122:8080";//正式上线版本
    public static final String HOST = "http://bwapp.flqapp.com:8089";//正式上线版本
//    public static final String HOST = "http://192.168.3.122:8080";//正式上线版本
    public static final String BAICHUAN_APPKEY = "24980167";
    public static final String BAICHUAN_PID = "mm_124933865_56750082_19509700484";
app/src/com/hanju/video/app/util/PhotoCrop.java
New file
@@ -0,0 +1,184 @@
package com.hanju.video.app.util;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class PhotoCrop {
    /**
     * 获取相册图片
     *
     * @param uri
     */
    public Uri startPhotoZoom(Uri uri, Context mContext) {
        Uri uriClipUri = null;
        //com.android.camera.action.CROP,这个action是调用系统自带的图片裁切功能
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");//裁剪的图片uri和图片类型
        intent.putExtra("crop", "true");//设置允许裁剪,如果不设置,就会跳过裁剪的过程,还可以设置putExtra("crop", "circle")
        if (Build.MANUFACTURER.equals("HUAWEI")) { //华为特殊处理 不然会显示圆
            intent.putExtra("aspectX", 9998);
            intent.putExtra("aspectY", 9999);
        } else {
            intent.putExtra("aspectX", 1);//裁剪框的 X 方向的比例,需要为整数
            intent.putExtra("aspectY", 1);//裁剪框的 Y 方向的比例,需要为整数
        }
        intent.putExtra("outputX", 600);//返回数据的时候的X像素大小。
        intent.putExtra("outputY", 600);//返回数据的时候的Y像素大小。
        //裁剪时是否保留图片的比例,这里的比例是1:1
        intent.putExtra("scale", true);
        //是否是圆形裁剪区域true,设置了也不一定有效
        intent.putExtra("circleCrop", false);
        //uritempFile为Uri类变量,实例化uritempFile
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //如果是7.0的相册
            //设置裁剪的图片地址Uri
            uriClipUri = Uri.parse("file://" + "/" + android.os.Environment.getExternalStorageDirectory().getPath() + "/FLQImg/" + "clip.jpg");
        } else {
            uriClipUri = Uri.parse("file://" + "/" + android.os.Environment.getExternalStorageDirectory().getPath() + "/FLQImg/" + "clip.jpg");
        }
        Log.e("uriClipUri=====", "" + uriClipUri);
        //Android 对Intent中所包含数据的大小是有限制的,一般不能超过 1M,否则会使用缩略图 ,所以我们要指定输出裁剪的图片路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uriClipUri);
        intent.putExtra("return-data", false);//是否将数据保留在Bitmap中返回
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());//输出格式,一般设为Bitmap格式及图片类型
        intent.putExtra("noFaceDetection", false);//人脸识别功能
        ((Activity) mContext).startActivityForResult(intent, 1002);//裁剪完成的标识
        return uriClipUri;
    }
    /**
     * 图片压缩的方法(只是内存减少,避免oom,图片本身在disk盘体积不变)
     * 显示的Bitmap占用的内存少一点,还是需要去设置加载的像素长度和宽度(变成缩略图)
     *
     * @param mFile
     * @param crop  是否剪裁圆形图片 true 是 false 否
     * @return
     */
    public boolean compressPhto(File mFile, boolean crop) {
//        BitmapFactory这个类就提供了多个解析方法(decodeResource、decodeStream、decodeFile等)用于创建Bitmap。
//        比如如果图片来源于网络,就可以使用decodeStream方法;
//        如果是sd卡里面的图片,就可以选择decodeFile方法;
//        如果是资源文件里面的图片,就可以使用decodeResource方法等
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true; // 获取当前图片的边界大小
        //BitmapFactory.decodeResource(getResources(), R.drawable.bg, options);
        BitmapFactory.decodeFile(mFile.getAbsolutePath(), options);
        int outHeight = options.outHeight; //获取图片本身的高像素
        int outWidth = options.outWidth;//获取图片本身的宽的像素
        String outMimeType = options.outMimeType;
        options.inJustDecodeBounds = false;
        //inSampleSize的作用就是可以把图片的长短缩小inSampleSize倍,所占内存缩小inSampleSize的平方
        //对于inSampleSize值的大小有要求,最好是整数且2的倍数
        options.inSampleSize = caculateSampleSize(options, 500, 500);
        //etPath()得到的是构造file的时候的路径。getAbsolutePath()得到的是全路径
        String path = mFile.getPath();
        String absPath = mFile.getAbsolutePath();
        Bitmap bitmap = BitmapFactory.decodeFile(absPath, options);
        try {
            return saveBitmap(bitmap, "avatar.png", crop);//保存成功
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
//        ivUserPhoto.setImageBitmap(bitmap);
//        //尺寸压缩结果
//        ivSize.setImageBitmap(bitmap);
    }
    public Bitmap compressPhto(File mFile) {
//        BitmapFactory这个类就提供了多个解析方法(decodeResource、decodeStream、decodeFile等)用于创建Bitmap。
//        比如如果图片来源于网络,就可以使用decodeStream方法;
//        如果是sd卡里面的图片,就可以选择decodeFile方法;
//        如果是资源文件里面的图片,就可以使用decodeResource方法等
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true; // 获取当前图片的边界大小
        //BitmapFactory.decodeResource(getResources(), R.drawable.bg, options);
        BitmapFactory.decodeFile(mFile.getAbsolutePath(), options);
        int outHeight = options.outHeight; //获取图片本身的高像素
        int outWidth = options.outWidth;//获取图片本身的宽的像素
        String outMimeType = options.outMimeType;
        options.inJustDecodeBounds = false;
        //inSampleSize的作用就是可以把图片的长短缩小inSampleSize倍,所占内存缩小inSampleSize的平方
        //对于inSampleSize值的大小有要求,最好是整数且2的倍数
        options.inSampleSize = caculateSampleSize(options, 500, 500);
        //etPath()得到的是构造file的时候的路径。getAbsolutePath()得到的是全路径
        String path = mFile.getPath();
        String absPath = mFile.getAbsolutePath();
        Bitmap bitmap = BitmapFactory.decodeFile(absPath, options);
        return bitmap;
    }
    /**
     * 计算出所需要压缩的大小
     *
     * @param options
     * @param reqWidth  希望的图片宽大小
     * @param reqHeight 希望的图片高大小
     * @return
     */
    private int caculateSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        int sampleSize = 1;
        int picWidth = options.outWidth;
        int picHeight = options.outHeight;
        if (picWidth > reqWidth || picHeight > reqHeight) {
            int halfPicWidth = picWidth / 2;
            int halfPicHeight = picHeight / 2;
            while (halfPicWidth / sampleSize > reqWidth || halfPicHeight / sampleSize > reqHeight) {
                sampleSize *= 2;
            }
        }
        return sampleSize;
    }
    /**
     * 保存文件,
     *
     * @param bitmap
     * @param bitName 文件名
     * @param crop
     * @return
     * @throws IOException
     */
    private boolean saveBitmap(Bitmap bitmap, String bitName, boolean crop) throws IOException {
        boolean save = false;
        File storageDir = new File(Environment.getExternalStorageDirectory().getPath() + "/FLQImg/");
        if (!storageDir.exists()) {//没有文件夹则创建
            storageDir.mkdir();
        }
        String fileName;
        File file;
        fileName = Environment.getExternalStorageDirectory().getPath() + "/FLQImg/" + bitName;
        file = new File(fileName);
        if (bitmap != null) {
            if (file.exists()) {
                file.delete();
            }
            FileOutputStream out;
            out = new FileOutputStream(file);
            // 格式为 JPEG,照相机拍出的图片为JPEG格式的,PNG格式的不能显示在相册中
            if (bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)) {
                out.flush();
                out.close();
            }
            save = true;//保存成功
        }
        return save;
    }
}
app/src/com/hanju/video/app/util/UserUtil.java
@@ -50,6 +50,13 @@
        return preferences.getString("loginUid", null);
    }
    public static void logout(Context context) {
        SharedPreferences preferences = context.getSharedPreferences("user", MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.remove("loginUid");
        editor.commit();
    }
    /**
     * 登录成功
     *
app/src/com/hanju/video/app/util/browser/BWJavaInterface.java
@@ -1,21 +1,39 @@
package com.hanju.video.app.util.browser;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaScannerConnection;
import android.webkit.JavascriptInterface;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.lcjian.library.util.Environment;
import com.lcjian.library.util.common.StringUtils;
import com.hanju.video.app.util.AlibcTradeUtil;
import com.hanju.video.app.util.JumpActivityUtil;
import com.hanju.video.app.util.x5.X5WebView;
import com.lcjian.library.util.security.MD5Utils;
import com.tencent.android.tpush.horse.Tools;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
public class BWJavaInterface extends BaseBWJavaInterface {
@@ -134,4 +152,83 @@
        //权限未授权
        return ContextCompat.checkSelfPermission(mContext, permission) == PackageManager.PERMISSION_DENIED;
    }
    @JavascriptInterface
    public void savePicture(String url) {
        if (lacksPermissions(Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) { //存储权限未开启
            ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 10023);
        } else {//存储权限已开
            String md5 = MD5Utils.getMD532(url);
            String path = Environment.getExternalStorageDirectory()
                    + "/hanju";
            File file = new File(path + "/" + md5 + ".jpg");
            if (!file.exists()) {
                try {
                    File resultFile = saveImageFromPathToSdCard(mContext, url, path, md5 + ".jpg");
                    if (resultFile != null) {
                        mContext.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                MediaScannerConnection.scanFile(mContext, new String[]{file.getAbsolutePath()}, null, null);
                                Toast.makeText(mContext, "保存到相册成功", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                } catch (Exception e) {
                    Toast.makeText(mContext, "图片保存失败", Toast.LENGTH_LONG).show();
                    if (file.exists())
                        file.delete();
                }
            } else {
                Toast.makeText(mContext, "图片已经保存!", Toast.LENGTH_LONG).show();
            }
        }
    }
    //创建本地保存路径
    public static File createImageFilePath(String path, String imageFileName) throws IOException {
        File storageDir = new File(path);
        if (!storageDir.exists()) {
            storageDir.mkdir();
        }
        File image = new File(storageDir, imageFileName);
        return image;
    }
    //保存网络图片保存到本地
    public static final File saveImageFromPathToSdCard(Context context, String image,
                                                       String path, String imageFileName) {
        boolean success = false;
        File file = null;
        try {
            file = createImageFilePath(path, imageFileName);
            Bitmap bitmap = null;
            URL url = new URL(image);
            HttpURLConnection conn = null;
            conn = (HttpURLConnection) url.openConnection();
            InputStream is = null;
            is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
            FileOutputStream outStream;
            outStream = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
            outStream.flush();
            outStream.close();
            success = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (success) {
            MediaScannerConnection.scanFile(context, new String[]{file.getPath()}, null, null);
            return file;
        } else {
            return null;
        }
    }
}