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; } } }