Commit 467dccfd by mReturn

Merge remote-tracking branch 'remotes/origin/dev'

parents b0730950 85ef039a
Showing with 2714 additions and 73 deletions
......@@ -23,7 +23,7 @@ android {
}
}
ndk {
abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a','armeabi'
abiFilters 'x86', 'armeabi-v7a','armeabi'
}
}
......@@ -110,6 +110,9 @@ dependencies {
if (isSaleModule.toBoolean()) {
api project(':saleCenter')
}
if (isLearnModule.toBoolean()) {
api project(':learnCenter')
}
// compile(name: 'orderCenter-debug', ext: 'aar')
// compile(name: 'userCenter-debug', ext: 'aar')
// compile(name: 'messageCenter-debug', ext: 'aar')
......
......@@ -118,6 +118,7 @@
-keep class com.dayu.message.data.protocol.** { *; }
-keep class com.dayu.managercenter.data.** { *; }
-keep class com.dayu.order.api.protocol.** { *; }
-keep class com.dayu.learncenter.api.** { *; }
-keep class com.dayu.order.sqlbean.** { *; }
-keep class com.dayu.provider.event.** { *; }
-keep class com.dayu.usercenter.data.protocol.** { *; }
......@@ -125,6 +126,7 @@
-keep class com.dayu.usercenter.event.** { *; }
-keep class com.bigfish.salecenter.model.** { *; }
-keep class com.bigfish.salecenter.event.** { *; }
-keep class com.bigfish.learncenter.event.** { *; }
-keep class com.dayu.event.** { *; }
#-------------------------------------------------------------------------
......@@ -294,9 +296,9 @@ public static final int *;
-keep public class cn.jzvd.demo.CustomMedia.JZMediaIjk {*; }
-keep public class cn.jzvd.demo.CustomMedia.JZMediaSystemAssertFolder {*; }
-keep class tv.danmaku.ijk.media.player.** {*; }
-dontwarn tv.danmaku.ijk.media.player.*
-keep interface tv.danmaku.ijk.media.player.** { *; }
#ijkplayer
-keep class tv.danmaku.ijk.media.** {*;}
......
......@@ -146,7 +146,10 @@
<activity
android:name=".ui.MainActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize|keyboardHidden"
android:windowSoftInputMode="stateHidden|adjustPan"
/>
<activity
android:name="com.dayu.bigfish.ui.ManagerActivity"
android:launchMode="singleTask"
......
......@@ -141,7 +141,11 @@ public class MainPresenter extends MainContract.Presenter {
@Override
public void getUserInfo(int accountId) {
UserApiFactory.getEngineerInfo(accountId).subscribe(baseObserver(
engineerInfo -> SPUtils.put("USER_IDENTITY", engineerInfo.getIdentity())));
engineerInfo -> {
SPUtils.put("USER_IDENTITY", engineerInfo.getIdentity());
mUser.setMobile(engineerInfo.getMobile());
UserManager.getInstance().saveUser(mUser);
}));
}
}
......@@ -3,6 +3,7 @@ package com.dayu.bigfish.ui;
import com.dayu.base.ui.activity.DataBindingActivity;
import com.dayu.bigfish.AboutUsBinding;
import com.dayu.bigfish.R;
import com.dayu.utils.AppUtils;
/**
* 关于我们
......@@ -19,6 +20,8 @@ public class AboutUsActivity extends DataBindingActivity<AboutUsBinding> {
@Override
public void initView() {
mBind.ivBack.setOnClickListener(o -> finish());
String versionCode = AppUtils.getPackageNum();
mBind.tvVersion.setText(getString(R.string.tv_now_version)+versionCode);
}
}
......@@ -3,7 +3,6 @@ package com.dayu.bigfish.ui;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
......@@ -20,7 +19,8 @@ import android.widget.TextView;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import com.bigfish.salecenter.event.SaleTabNumEvent;
import com.dayu.event.LearnTabNumEvent;
import com.dayu.event.SaleTabNumEvent;
import com.bigfish.salecenter.ui.fragment.HomeSaleFragment;
import com.dayu.base.api.Api;
import com.dayu.base.api.DownloadService;
......@@ -35,16 +35,14 @@ import com.dayu.bigfish.api.protocol.VersionInfo;
import com.dayu.bigfish.databinding.ActivityMainBinding;
import com.dayu.bigfish.presenter.main.MainContract;
import com.dayu.bigfish.presenter.main.MainPresenter;
import com.dayu.bigfish.ui.fragment.HomeFirstTabFragment;
import com.dayu.bigfish.ui.service.LocationService;
import com.dayu.bigfish.utils.HxManager;
import com.dayu.common.BaseApplication;
import com.dayu.common.Constants;
import com.dayu.event.DownloadBean;
import com.dayu.event.UserInfo;
import com.dayu.learncenter.ui.fragment.HomeLearnFragment;
import com.dayu.location.base.LocationUtils;
import com.dayu.managercenter.ui.fragment.ManagerFragment;
import com.dayu.message.ui.fragment.HomeMessageFragment;
import com.dayu.order.common.TabNumEvent;
import com.dayu.order.ui.activity.OrderDetailsActivity;
import com.dayu.order.ui.activity.ReceivingActivity;
......@@ -54,12 +52,10 @@ import com.dayu.provider.event.RefreshReceivingNum;
import com.dayu.provider.event.SwtichFragment;
import com.dayu.provider.router.RouterPath;
import com.dayu.usercenter.ui.activity2.BusinessTypeActivity;
import com.dayu.usercenter.ui.fragment.HomePersonFragment;
import com.dayu.usercenter.ui.fragment.HomeUserFragment;
import com.dayu.utils.LogUtils;
import com.dayu.utils.SPUtils;
import com.dayu.utils.TimeUtils;
import com.dayu.utils.ToastUtils;
import com.dayu.utils.UserManager;
import com.dayu.utils.badgeNumberManger.BadgeNumberManager;
import com.dayu.widgets.BadgeView;
......@@ -73,8 +69,9 @@ import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import cn.jzvd.Jzvd;
import cn.jzvd.JzvdStd;
/**
* Created by luofan
......@@ -92,12 +89,14 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin
// private HomeFirstTabFragment firstFragment;
private HomeSaleFragment saleFragment;
private HomeOrderFragment secondFragment;
private HomeLearnFragment learnFragment;
// private HomeMessageFragment thirdFragment;
// private HomePersonFragment fourFragment;
private HomeUserFragment fourFragment;
private int mFirstPositon = 0;
private BadgeView mOrderBadgeView;
private BadgeView mSaleBadgeView;
private BadgeView mLearnBadgeView;
@Override
public int getLayoutId() {
......@@ -118,24 +117,25 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin
MobclickAgent.onEvent(this, "go_home");
saleFragment = HomeSaleFragment.newInstance();
secondFragment = HomeOrderFragment.newInstance();
learnFragment = new HomeLearnFragment();
fourFragment = HomeUserFragment.newInstance();
// thirdFragment = HomeMessageFragment.newInstance();
// fourFragment = HomePersonFragment.newInstance();
fourFragment = HomeUserFragment.newInstance();
if (UserManager.getInstance().getRole() == Constants.ENGINEER) {
// if (UserManager.getInstance().getRole() == Constants.ENGINEER) {
// firstFragment = HomeFirstTabFragment.newInstance();
// mFragments = new Fragment[]{firstFragment, secondFragment, thirdFragment, fourFragment};
// mFirstPositon = 1;
mFragments = new Fragment[]{saleFragment, secondFragment, fourFragment};
mFragments = new Fragment[]{saleFragment, secondFragment, learnFragment,fourFragment};
mFirstPositon = 0;
} else if (UserManager.getInstance().getRole() == Constants.MANAGER_ENGINEER) {
// } else if (UserManager.getInstance().getRole() == Constants.MANAGER_ENGINEER) {
// managerFragment = ManagerFragment.newInstance();
// mFragments = new Fragment[]{managerFragment, secondFragment, thirdFragment, fourFragment};
mFragments = new Fragment[]{saleFragment, secondFragment, fourFragment};
mFirstPositon = 0;
mBind.tabFirst.setText(getString(R.string.send_order));
}
// mFragments = new Fragment[]{saleFragment, secondFragment, learnFragment,fourFragment};
// mFirstPositon = 0;
// mBind.tabFirst.setText(getString(R.string.send_order));
// }
// mTabs = new TextView[]{mBind.tabFirst, mBind.tabSecond, mBind.tabThird, mBind.tabFour};
mTabs = new TextView[]{mBind.tabSale, mBind.tabSecond, mBind.tabFour};
mTabs = new TextView[]{mBind.tabSale, mBind.tabSecond,mBind.tabLearn, mBind.tabFour};
addFragment();
initListener();
doAction(getIntent());
......@@ -177,7 +177,8 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin
}
});
mBind.tabFour.setOnClickListener(o -> showHideFragment(2, mPosition));
mBind.tabLearn.setOnClickListener(o -> showHideFragment(2, mPosition));
mBind.tabFour.setOnClickListener(o -> showHideFragment(3, mPosition));
}
//提示去认证身份
......@@ -224,6 +225,7 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin
*/
private void showHideFragment(int showPosition, int hidePosition) {
if (showPosition == hidePosition) return;
if (showPosition != 2) JzvdStd.goOnPlayOnPause();
mFragmentManger.beginTransaction()
.hide(mFragments[hidePosition])
.show(mFragments[showPosition])
......@@ -313,6 +315,22 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin
mSaleBadgeView.setText("99+");
}
}
@Subscribe
public void changeLearnNum(LearnTabNumEvent event) {
if (event.num <= 0)
return;
if (mLearnBadgeView == null) {
mLearnBadgeView = new BadgeView(this);
mLearnBadgeView.setTargetView(mBind.tabLearn);
mLearnBadgeView.setBadgeGravity(Gravity.CENTER | Gravity.TOP);
mLearnBadgeView.setBadgeMargin(20, 0, 0, 0);
}
if (event.num < 100) {
mLearnBadgeView.setText(event.num + "", TextView.BufferType.NORMAL);
} else {
mLearnBadgeView.setText("99+");
}
}
@Override
......@@ -467,13 +485,11 @@ public class MainActivity extends BaseActivity<MainPresenter, ActivityMainBindin
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
public void onBackPressed() {
if (!Jzvd.backPress()) {
// 不退出程序,进入后台
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
@Subscribe(threadMode = ThreadMode.MAIN)
......
......@@ -24,6 +24,7 @@ import io.reactivex.disposables.Disposable;
import okhttp3.MediaType;
import okhttp3.RequestBody;
/**
* Created by luofan
* on 2018/7/17.
......@@ -57,6 +58,9 @@ public class LocationService extends Service {
jsonObject.put("siteId", mSiteId);
jsonObject.put("longitude", location.getLongitude());
jsonObject.put("latitude", location.getLatitude());
jsonObject.put("provinceName", location.getProvince());
jsonObject.put("cityName", location.getCity());
jsonObject.put("districtName", location.getDistrict());
} catch (JSONException e) {
e.printStackTrace();
}
......
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/img_tab_learn_selected" android:state_selected="true"/>
<item android:drawable="@mipmap/img_tab_learn"/>
</selector>
\ No newline at end of file
......@@ -79,6 +79,19 @@
android:textColor="#585858"
android:textSize="10sp" />
<TextView
android:id="@+id/tab_learn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:drawablePadding="2dp"
android:drawableTop="@drawable/tab_learn_selector"
android:gravity="center"
android:text="@string/learn_str"
android:textColor="#585858"
android:textSize="10sp" />
<LinearLayout
android:visibility="gone"
android:id="@+id/tab_get_order"
......
......@@ -52,7 +52,7 @@
android:layout_width="@dimen/dp_205"
android:layout_height="@dimen/dp_205"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/dp_57"
android:layout_marginTop="40dp"
android:src="@mipmap/about_us"
/>
......@@ -82,12 +82,22 @@
android:textSize="@dimen/sp_15"
/>
<TextView
android:id="@+id/tv_version"
style="@style/common_text_style"
android:layout_below="@id/about_main_text"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/dp_30"
android:text="@string/tv_now_version"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/about_main_text"
android:layout_below="@id/tv_version"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/dp_41"
android:layout_marginTop="@dimen/dp_20"
android:text="@string/tv_about_dayu"
android:textColor="@color/cl_selector_hui"
android:textSize="@dimen/sp_12"
......
......@@ -70,10 +70,12 @@ dependencies {
api 'com.journeyapps:zxing-android-embedded:3.5.0'
api project(':locationComponent')
api project(':pickerview')
// api 'cn.jzvd:jiaozivideoplayer:7.2.4'
api 'cn.jzvd:jiaozivideoplayer:7.1.0'
// api 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4'
// api 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
// api 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.4'
// api 'cn.jzvd:jiaozivideoplayer:7.3.0'
// api 'com.google.android.exoplayer:exoplayer:2.9.6'
api 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
api 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
api 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.35'
api 'com.badoo.mobile:android-weak-handler:1.1'
api 'com.youth.banner:banner:1.4.10'
......@@ -82,6 +84,9 @@ dependencies {
api 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0'
api 'com.google.android:flexbox:1.0.0'
api 'com.github.chrisbanes:PhotoView:2.0.0'
// api 'cjt.library.wheel:camera:1.1.9'
api project(':umeng')
api project(':camera')
}
......@@ -14,9 +14,12 @@
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
<activity android:name="com.dayu.base.ui.activity.PreviewActivty" />
<activity android:name="com.dayu.base.ui.activity.ImgGalleryActivty"
android:screenOrientation="portrait"/>
<activity
android:name="com.dayu.base.ui.activity.ImgGalleryActivty"
android:screenOrientation="portrait" />
<activity android:name="com.dayu.base.ui.activity.CameraActivity" />
</application>
</manifest>
package com.dayu.base.api;
import com.dayu.base.api.protocol.AddressInfoBean;
import com.dayu.base.api.protocol.BaseResponse;
import com.dayu.base.api.protocol.TreeAddressBean;
import com.dayu.common.Constants;
......@@ -50,6 +51,17 @@ public interface APIService {
@Part MultipartBody.Part part);
/**
* 上传单个视频.
*
* @param part
* @return
*/
@Multipart
@POST(Constants.UP_VIDEO)
Observable<BaseResponse<String>> uploadVideo(
@Part MultipartBody.Part part);
/**
* 上传图片多张,无水印.
*
* @param partMap
......@@ -67,4 +79,12 @@ public interface APIService {
*/
@GET(Constants.API_7300+"/geography/tree/{parentId}")
Observable<BaseResponse<List<TreeAddressBean>>> getTreeAddress(@Path("parentId") int parednId);
/**
* 获取地址信息.
*
* @return
*/
@GET(Constants.API_7100 + "/engineerAddress/default/accountId/{accountId}")
Observable<BaseResponse<AddressInfoBean>> getAddressInfo(@Path("accountId") int accountId);
}
......@@ -76,7 +76,7 @@ public class Api {
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
.create();
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(m -> LogUtils.i("request", m));
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
TokenInterceptord tokenInterceptord = new TokenInterceptord();
OkHttpClient.Builder build = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
......
package com.dayu.base.api;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.Observable;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
/**
* Created by luofan
......@@ -20,9 +24,32 @@ public class BaseApiFactory {
return Api.getService(APIService.class).uploadPhoto(part).compose(Api.applySchedulers());
}
public static Observable<String> uploadVideo(MultipartBody.Part part) {
return Api.getService(APIService.class).uploadVideo(part).compose(Api.applySchedulers());
}
public static Observable<List<String>> uploadPhoto(MultipartBody.Part[] part, String style) {
return Api.getService(APIService.class).uploadPhoto(part, style).compose(Api.applySchedulers());
}
public static MultipartBody.Part[] packPhoto(List<String> imageUrl) {
ArrayList<File> files = new ArrayList<>();
if (imageUrl != null && imageUrl.size() > 0) {
for (int i = 0; i < imageUrl.size(); i++) {
files.add(new File(imageUrl.get(i)));
}
}
MultipartBody.Part[] part = new MultipartBody.Part[files.size()];
for (int i = 0; i < files.size(); i++) {
RequestBody requestFile =
RequestBody.create(MediaType.parse("multipart/form-data"), files.get(i));
MultipartBody.Part body =
MultipartBody.Part.createFormData("fileUpload", files.get(i).getName(), requestFile);
part[i] = body;
}
return part;
}
}
package com.dayu.order.api.protocol;
package com.dayu.base.api.protocol;
public class CommentReplyData {
public int accountId; //留言人或回复人账号ID
......
package com.dayu.base.ui.activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;
import com.cjt2325.cameralibrary.JCameraView;
import com.cjt2325.cameralibrary.listener.ClickListener;
import com.cjt2325.cameralibrary.listener.ErrorListener;
import com.cjt2325.cameralibrary.listener.JCameraListener;
import com.cjt2325.cameralibrary.util.DeviceUtil;
import com.cjt2325.cameralibrary.util.FileUtil;
import com.dayu.baselibrary.R;
import com.dayu.common.Constants;
import com.dayu.utils.ToastUtils;
import java.io.File;
/**
* 拍照/视频界面
*/
public class CameraActivity extends AppCompatActivity {
/**
* 视频保存目录
*/
public static final String VIDEO_PATH = "dayu/video";
private JCameraView jCameraView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_camera);
jCameraView = (JCameraView) findViewById(R.id.jcameraview);
//设置视频保存路径
jCameraView.setSaveVideoPath(Environment.getExternalStorageDirectory().getPath() + File.separator + VIDEO_PATH);
jCameraView.setMediaQuality(JCameraView.MEDIA_QUALITY_HIGH);
if (getIntent().hasExtra(Constants.ONLY_VIDEO)) {
jCameraView.setTip(getResources().getString(R.string.moment_take_video));
jCameraView.setFeatures(jCameraView.BUTTON_STATE_ONLY_RECORDER);
} else {
jCameraView.setFeatures(jCameraView.BUTTON_STATE_BOTH);
jCameraView.setTip(getResources().getString(R.string.moment_take_photo));
}
jCameraView.setErrorLisenter(new ErrorListener() {
@Override
public void onError() {
//错误监听
Intent intent = new Intent();
setResult(Constants.CAMERA_CODE, intent);
finish();
}
@Override
public void AudioPermissionError() {
Toast.makeText(CameraActivity.this, getResources().getString(R.string.moment_permission_4), Toast.LENGTH_SHORT).show();
}
});
//JCameraView监听
jCameraView.setJCameraLisenter(new JCameraListener() {
@Override
public void captureSuccess(Bitmap bitmap) {
String path = FileUtil.saveBitmap(VIDEO_PATH, bitmap);
Intent intent = new Intent();
intent.putExtra("imgPath", path);
setResult(Constants.CAMERA_IMG, intent);
finish();
}
@Override
public void recordSuccess(String url, Bitmap firstFrame) {
//获取视频路径
String path = FileUtil.saveBitmap(VIDEO_PATH, firstFrame);
final File file = new File(url);
if (file.exists())
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(file.getPath()))));
// sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
// if (getIntent().hasExtra(Constants.ONLY_VIDEO)){
//// EventBus.getDefault().post(new VideoRecordedEvent(path,url));
// }else {
Intent intent = new Intent();
intent.putExtra("imgPath", path);
intent.putExtra("videoPath", url);
setResult(Constants.CAMERA_VIDEO, intent);
// }
finish();
}
});
jCameraView.setLeftClickListener(new ClickListener() {
@Override
public void onClick() {
CameraActivity.this.finish();
}
});
Log.i("YUU", DeviceUtil.getDeviceModel());
}
@Override
protected void onStart() {
super.onStart();
//全屏显示
if (Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
} else {
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(option);
}
}
@Override
protected void onResume() {
super.onResume();
jCameraView.onResume();
}
@Override
protected void onPause() {
super.onPause();
jCameraView.onPause();
}
}
package com.dayu.order.ui.adapter;
package com.dayu.base.ui.adapter;
import android.text.Html;
import android.view.View;
import com.dayu.base.ui.adapter.CoreAdapter;
import com.dayu.order.R;
import com.dayu.order.api.protocol.CommentBean;
import com.dayu.order.databinding.ItemCommentBinding;
import com.dayu.base.api.protocol.CommentBean;
import com.dayu.baselibrary.R;
import com.dayu.baselibrary.databinding.ItemCommentBinding;
import com.dayu.utils.CommonUtils;
import com.dayu.utils.GlideImageLoader;
/**
* Created by mReturn
* on 2020\1\9 0009.
*/
public class CommentAdapter extends CoreAdapter<CommentBean, ItemCommentBinding> {
public CommentAdapter(boolean needFoot) {
super(needFoot);
this.setViewType(R.layout.item_comment);
}
public CommentAdapter(boolean needFoot, int viewType) {
......
......@@ -36,6 +36,12 @@ public class PhotoViewAdapter extends RecyclerView.Adapter<PhotoViewAdapter.Hold
private ArrayList<String> list;
private OnItemClickListener<PhotoViewAdapter.Holder, Integer> listener;
private boolean canDelete = true; //是否可以删除
public void setCanDelete(boolean canDelete) {
this.canDelete = canDelete;
}
public PhotoViewAdapter(ArrayList<String> list, Activity context) {
mIvSize = (UtilsScreen.getScreenWidth(context) - UtilsScreen.dip2px(context, 20)) / 5;
this.context = context;
......@@ -63,8 +69,8 @@ public class PhotoViewAdapter extends RecyclerView.Adapter<PhotoViewAdapter.Hold
holder.delete.setVisibility(View.GONE);
holder.picture.setOnClickListener(v -> showPicDialog());
} else {
holder.delete.setVisibility(canDelete?View.VISIBLE:View.GONE);
GlideImageLoader.load(context, list.get(position), holder.picture);
holder.delete.setVisibility(View.VISIBLE);
holder.delete.setOnClickListener(v -> removeItem(position));
holder.picture.setOnClickListener(v -> {
ArrayList temp = new ArrayList();
......@@ -124,7 +130,7 @@ public class PhotoViewAdapter extends RecyclerView.Adapter<PhotoViewAdapter.Hold
.hideBottomControls(true)// 是否显示uCrop工具栏,默认不显示 true or false
.compressSavePath(getPath())//压缩图片保存地址
.previewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false
// .minimumCompressSize(100)// 小于100kb的图片不压缩
.minimumCompressSize(2*1024)// 小于**kb的图片不压缩
.synOrAsy(true);//同步true或异步false 压缩 默认同步、
// .enableCrop(true)//是否裁剪
// .freeStyleCropEnabled(true)
......
......@@ -33,12 +33,13 @@ public class Constants {
public static final String INVITE_NEW_SHARE_URL = "http://app.dl.kf.ai/ext/#/shareMaster?code="; //邀请新人分享链接
/**
* 测试环境配置.
* dev环境配置.
*/
// public static final int LOG_LEVEL = LogUtils.LEVEL_ALL;
// public static final String ENVIROMENT = "debug";
// public static final String BASE_URL = "http://47.94.101.239:3112";
// public final static String UP_PHOTO = "/file/uploadMore?targetPath=test/sp/mobile/android/business/checkApply";
// public final static String UP_VIDEO = "/file/uploadVideoOne?targetPath=dev/video";
// public final static String WEB_SOP = "http://47.94.101.239:9004/#/sop";
// public final static String CHECK_MULTI_WEB_SOP = "http://47.94.101.239:9004/#/manyServiceResult";
// public final static String MULTI_WEB_SOP = "http://47.94.101.239:9004/#/manySop";
......@@ -47,12 +48,13 @@ public class Constants {
// public static final boolean IS_DEBUG = true;
/**
* uat环境配置.
* uat测试环境配置.
*/
// public static final String ENVIROMENT = "uat";
// public static final int LOG_LEVEL = LogUtils.LEVEL_ALL;
// public static final String BASE_URL = "http://47.95.223.6:3112";
// public final static String UP_PHOTO = "/file/uploadMore?targetPath=test/sp/mobile/android/business/checkApply";
// public final static String UP_VIDEO = "/file/uploadVideoOne?targetPath=test/video";
// public final static String WEB_SOP = "http://47.95.223.6:9004/#/sop";
// public final static String WEB_SOP_DETAIL = "http://47.95.223.6:9004/#/sopdetail";
// public final static String WEB_ZHI_SHI = "http://47.95.223.6:9004/#/detail";
......@@ -67,6 +69,7 @@ public class Constants {
public static final int LOG_LEVEL = LogUtils.LEVEL_OFF;
public static final String BASE_URL = "https://mobile.kf.ai";
public final static String UP_PHOTO = "/file/uploadMore?targetPath=online/sp/mobile/android/business/checkApply";
public final static String UP_VIDEO = "/file/uploadVideoOne?targetPath=online/video";
public final static String WEB_SOP = "https://sop.kf.ai/#/sop";
public final static String WEB_SOP_DETAIL = "https://sop.kf.ai/#/sopdetail";
public final static String WEB_ZHI_SHI = "https://sop.kf.ai/#/detail";
......@@ -166,6 +169,7 @@ public class Constants {
public final static String IDS = "ids";
public final static String OPERATE_DETAIL = "operate_detail";
public final static String CAN_EDIT = "can_edit";
//订单详情
public final static String ORDER_DETAIL = "order_detail";
//数据返回失败标识
......@@ -176,7 +180,9 @@ public class Constants {
public final static String ACCOUNT_BALANCE = "account_balance";
public final static String ACCOUNT_ID = "accountId";
public final static String ORDER_ID = "orderId";
public final static String ORDER_SOURCE = "order_source"; //1.服务站自建 4.小程序单 5.服务商自建 6.服务商EU单
public final static String TO_DETAIL = "toDetail";
public final static String DETAIL = "detail";
public final static String UMENG_DEVICE_TOKEN = "umeng_device_token";
public final static String ORDER_POSTION = "order_position";
//是否显示去设置alipay账户de对话框
......@@ -231,6 +237,11 @@ public class Constants {
public static final String CETIFICATION_STATE = "cetificaiton_state";//1:接单跳转、待预约 0:登录页,个人中心跳转
public static final String IS_FORCE = "is_force";
public static final String ONLY_VIDEO = "only_video";
public static final String NO_WATERMARK = "nowatermark";
public static final int CAMERA_CODE = 100;
public static final int CAMERA_IMG = 101;
public static final int CAMERA_VIDEO = 102;
public static final HashMap<Integer,List<TreeAddressBean>> treeAddressMap = new HashMap<>(); //地址数据
/**
......
package com.dayu.event;
public class LearnTabNumEvent {
public int num;
public LearnTabNumEvent(int num) {
this.num = num;
}
}
......@@ -34,6 +34,15 @@ public class UserInfo {
private int status;
private int detectStatus;
private List<Integer> roles;
private String mobile;
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public List<Integer> getRoles() {
return roles;
......
......@@ -4,10 +4,12 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.text.TextUtils;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;
import android.widget.TextView;
import com.dayu.baselibrary.R;
......@@ -21,11 +23,14 @@ import com.umeng.socialize.media.UMImage;
import com.umeng.socialize.media.UMMin;
import com.umeng.socialize.media.UMWeb;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import cn.jzvd.JzvdStd;
/**
* Created by mReturn
* on 2020\1\8 0008.
......@@ -228,6 +233,31 @@ public class CommonUtils {
}
}
/**
* 获取视频时长
* @param videoPath
* @return 毫秒
*/
public static long getVideoLength(String videoPath) {
long duration;
try {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(videoPath);
duration = Long.parseLong(mmr.extractMetadata
(MediaMetadataRetriever.METADATA_KEY_DURATION));
} catch (Exception e) {
e.printStackTrace();
return 0;
}
return duration;
}
public static void setVideoThumb(Context context, JzvdStd jzvdStd, String url) {
// jzvdStd.thumbImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
// GlideImageLoader.loadFit(context, jzvdStd.thumbImageView,url, R.drawable.icon_video_default);
// url = url.replace("http:","https:")+"?x-oss-process=video/snapshot,t_0,f_jpg,ar_auto";
GlideImageLoader.load(context, jzvdStd.thumbImageView,url, R.drawable.icon_video_default);
}
/**
* 微信(朋友圈)分享链接(包含标题内容)
......@@ -275,4 +305,24 @@ public class CommonUtils {
.setCallback(callBack).share();
}
/**
* 获取年月日 格式日期
*/
public static String getYearData(String dataStr) {
if (TextUtils.isEmpty(dataStr)){
return UIUtils.getString(R.string.unknown);
}else{
SimpleDateFormat df = null;
Date sDate = null;
try {
df = new SimpleDateFormat("yyyy-MM-dd");
sDate = df.parse(dataStr);
return df.format(sDate);
} catch (ParseException e) {
e.printStackTrace();
return UIUtils.getString(R.string.unknown);
}
}
}
}
package com.dayu.utils;
import android.app.Activity;
import android.os.Environment;
import com.luck.picture.lib.PictureSelectionModel;
import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType;
import java.io.File;
public class MediaChooseUtils {
/**
* 选择单张图片
*/
public static void chooseSigleImg(Activity activity) {
chooseMedia(activity,PictureMimeType.ofImage(),1,0);
}
/**
* 选择头像图片并裁剪
*/
public static void chooseAvatarImg(Activity activity) {
PictureSelectionModel selector = getPictureSelectionModel(activity, PictureMimeType.ofImage(), 1, 0);
selector.enableCrop(true)//是否裁剪
.withAspectRatio(1, 1)
.freeStyleCropEnabled(false);
selector.forResult(PictureConfig.CHOOSE_REQUEST);
}
/**
* 选择多张图片
*/
public static void chooseImgs(Activity activity,int maxCount) {
chooseMedia(activity,PictureMimeType.ofImage(),maxCount,0);
}
/**
* 选择单个视频
*/
public static void chooseSigleVideo(Activity activity,int videoLength) {
// chooseMedia(activity,PictureMimeType.ofVideo(),1,videoLength);
PictureSelectionModel selector = getPictureSelectionModel(activity, PictureMimeType.ofVideo(),1, videoLength);
selector.isCamera(false).forResult(PictureConfig.CHOOSE_REQUEST);
}
/**
* 选择多个视频
*/
public static void chooseVideos(Activity activity,int maxCount,int videoLength) {
chooseMedia(activity,PictureMimeType.ofVideo(),maxCount,videoLength);
}
/**
* 选择多媒体文件
* @param activity
* @param type
* @param maxCount
* @param videoLength
*/
public static void chooseMedia(Activity activity,int type,int maxCount,int videoLength) {
PictureSelectionModel selector = getPictureSelectionModel(activity, type, maxCount, videoLength);
selector.forResult(PictureConfig.CHOOSE_REQUEST);
}
public static PictureSelectionModel getPictureSelectionModel(Activity activity, int type, int maxCount, int videoLength) {
return PictureSelector.create(activity)
.openGallery(type)//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()
.maxSelectNum(maxCount)// 最大图片选择数量 int
.imageSpanCount(4)// 每行显示个数 int
.selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
.previewImage(true)// 是否可预览图片 true or false
.isCamera(true)// 是否显示拍照按钮 true or false
.recordVideoSecond(videoLength) //最大视频长度(秒)
.videoMaxSecond(videoLength) //最大视频长度(秒)
.isZoomAnim(true)// 图片列表点击 缩放效果 默认true
.sizeMultiplier(0.1f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
.setOutputCameraPath("/CustomPath")// 自定义拍、照保存路径,可不填
.compress(true)// 是否压缩 true or false
.glideOverride(300, 500)// int glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度
.hideBottomControls(true)// 是否显示uCrop工具栏,默认不显示 true or false
.compressSavePath(getPath())//压缩图片保存地址
.previewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false
.minimumCompressSize(100)// 小于100kb的图片不压缩
// .enableCrop(true)//是否裁剪
// .freeStyleCropEnabled(true)
.synOrAsy(true);
}
public static String getPath() {
String path = Environment.getExternalStorageDirectory() + "/dayu/image/";
File file = new File(path);
if (file.mkdirs()) {
return path;
}
return path;
}
}
......@@ -24,6 +24,8 @@ public class SPUtils {
* @param object 存储的数据类型
*/
public static void put(String key, Object object) {
if (object == null)
return;
SharedPreferences sp = BaseApplication.getContext().getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
......
package com.dayu.widgets;
import android.graphics.SurfaceTexture;
import android.media.AudioManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.view.Surface;
import java.io.IOException;
import cn.jzvd.JZMediaInterface;
import cn.jzvd.Jzvd;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
import tv.danmaku.ijk.media.player.IjkTimedText;
/**
* Created by Nathen on 2017/11/18.
* ijk兼容SO库:https://github.com/NamHofstadter/IjkPlayerSos
* ijk默认不支持https协议,需要的请自行下载so库
*/
public class JZMediaIjk extends JZMediaInterface implements IMediaPlayer.OnPreparedListener, IMediaPlayer.OnVideoSizeChangedListener, IMediaPlayer.OnCompletionListener, IMediaPlayer.OnErrorListener, IMediaPlayer.OnInfoListener, IMediaPlayer.OnBufferingUpdateListener, IMediaPlayer.OnSeekCompleteListener, IMediaPlayer.OnTimedTextListener {
IjkMediaPlayer ijkMediaPlayer;
public JZMediaIjk(Jzvd jzvd) {
super(jzvd);
}
@Override
public void start() {
if (ijkMediaPlayer != null) ijkMediaPlayer.start();
}
@Override
public void prepare() {
release();
mMediaHandlerThread = new HandlerThread("JZVD");
mMediaHandlerThread.start();
mMediaHandler = new Handler(mMediaHandlerThread.getLooper());//主线程还是非主线程,就在这里
handler = new Handler();
mMediaHandler.post(() -> {
ijkMediaPlayer = new IjkMediaPlayer();
ijkMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
////1为硬解 0为软解
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);
//使用opensles把文件从java层拷贝到native层
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "opensles", 0);
//视频格式
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);
//跳帧处理(-1~120)。CPU处理慢时,进行跳帧处理,保证音视频同步
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 1);
//0为一进入就播放,1为进入时不播放
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);
////域名检测
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);
//设置是否开启环路过滤: 0开启,画面质量高,解码开销大,48关闭,画面质量差点,解码开销小
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
//最大缓冲大小,单位kb
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", 1024 * 1024);
//某些视频在SeekTo的时候,会跳回到拖动前的位置,这是因为视频的关键帧的问题,通俗一点就是FFMPEG不兼容,视频压缩过于厉害,seek只支持关键帧,出现这个情况就是原始的视频文件中i 帧比较少
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
//是否重连
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "reconnect", 1);
//http重定向https
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
//设置seekTo能够快速seek到指定位置并播放
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "fastseek");
//播放前的探测Size,默认是1M, 改小一点会出画面更快
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 1024 * 10);
ijkMediaPlayer.setOnPreparedListener(JZMediaIjk.this);
ijkMediaPlayer.setOnVideoSizeChangedListener(JZMediaIjk.this);
ijkMediaPlayer.setOnCompletionListener(JZMediaIjk.this);
ijkMediaPlayer.setOnErrorListener(JZMediaIjk.this);
ijkMediaPlayer.setOnInfoListener(JZMediaIjk.this);
ijkMediaPlayer.setOnBufferingUpdateListener(JZMediaIjk.this);
ijkMediaPlayer.setOnSeekCompleteListener(JZMediaIjk.this);
ijkMediaPlayer.setOnTimedTextListener(JZMediaIjk.this);
try {
ijkMediaPlayer.setDataSource(jzvd.jzDataSource.getCurrentUrl().toString());
ijkMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
ijkMediaPlayer.setScreenOnWhilePlaying(true);
ijkMediaPlayer.prepareAsync();
ijkMediaPlayer.setSurface(new Surface(jzvd.textureView.getSurfaceTexture()));
} catch (IOException e) {
e.printStackTrace();
}
});
}
@Override
public void pause() {
ijkMediaPlayer.pause();
}
@Override
public boolean isPlaying() {
return ijkMediaPlayer.isPlaying();
}
@Override
public void seekTo(long time) {
ijkMediaPlayer.seekTo(time);
}
@Override
public void release() {
if (mMediaHandler != null && mMediaHandlerThread != null && ijkMediaPlayer != null) {//不知道有没有妖孽
HandlerThread tmpHandlerThread = mMediaHandlerThread;
IjkMediaPlayer tmpMediaPlayer = ijkMediaPlayer;
JZMediaInterface.SAVED_SURFACE = null;
mMediaHandler.post(() -> {
tmpMediaPlayer.setSurface(null);
tmpMediaPlayer.release();
tmpHandlerThread.quit();
});
ijkMediaPlayer = null;
}
}
@Override
public long getCurrentPosition() {
return ijkMediaPlayer.getCurrentPosition();
}
@Override
public long getDuration() {
if (ijkMediaPlayer == null) return 0;
return ijkMediaPlayer.getDuration();
}
@Override
public void setVolume(float leftVolume, float rightVolume) {
ijkMediaPlayer.setVolume(leftVolume, rightVolume);
}
@Override
public void setSpeed(float speed) {
ijkMediaPlayer.setSpeed(speed);
}
@Override
public void onPrepared(IMediaPlayer iMediaPlayer) {
handler.post(() -> jzvd.onPrepared());
}
@Override
public void onVideoSizeChanged(IMediaPlayer iMediaPlayer, int i, int i1, int i2, int i3) {
handler.post(() -> jzvd.onVideoSizeChanged(iMediaPlayer.getVideoWidth(), iMediaPlayer.getVideoHeight()));
}
@Override
public boolean onError(IMediaPlayer iMediaPlayer, final int what, final int extra) {
handler.post(() -> jzvd.onError(what, extra));
return true;
}
@Override
public boolean onInfo(IMediaPlayer iMediaPlayer, final int what, final int extra) {
handler.post(() -> {
if (what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED) {
// 这里返回了视频的旋转角度,根据角度旋转视频到正确角度
jzvd.textureView.setRotation(extra);
} else {
jzvd.onInfo(what, extra);
}
});
return false;
}
@Override
public void onBufferingUpdate(IMediaPlayer iMediaPlayer, final int percent) {
handler.post(() -> jzvd.setBufferProgress(percent));
}
@Override
public void onSeekComplete(IMediaPlayer iMediaPlayer) {
handler.post(() -> jzvd.onSeekComplete());
}
@Override
public void onTimedText(IMediaPlayer iMediaPlayer, IjkTimedText ijkTimedText) {
}
@Override
public void setSurface(Surface surface) {
ijkMediaPlayer.setSurface(surface);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
if (SAVED_SURFACE == null) {
SAVED_SURFACE = surface;
prepare();
} else {
jzvd.textureView.setSurfaceTexture(SAVED_SURFACE);
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
@Override
public void onCompletion(IMediaPlayer iMediaPlayer) {
handler.post(() -> jzvd.onAutoCompletion());
}
}
......@@ -327,4 +327,8 @@ public class LRecyclerView<M, B> extends FrameLayout {
public void setOnEndListener(onEndListener listener) {
onEndListener = listener;
}
public void addOnChildAttachStateChangeListener(RecyclerView.OnChildAttachStateChangeListener listener){
recyclerview.addOnChildAttachStateChangeListener(listener);
}
}
package com.dayu.widgets;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import com.dayu.baselibrary.R;
import com.dayu.utils.ToastUtils;
import cn.jzvd.JzvdStd;
public class MyJzvdStd extends JzvdStd {
public int curProgress;
public long curPosition;
private PlayCallBack callBack;
public MyJzvdStd(Context context) {
super(context);
}
public MyJzvdStd(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public int getLayoutId() {
return R.layout.jz_layout_std;
}
@Override
public void startVideo() {
super.startVideo();
curProgress = 0;
curPosition = 0;
if (callBack != null)
callBack.onstart();
}
//onState 代表了播放器引擎的回调,播放视频各个过程的状态的回调
@Override
public void onProgress(int progress, long position, long duration) {
super.onProgress(progress, position, duration);
curProgress = progress;
curPosition = position;
}
@Override
public void onStatePreparing() {
super.onStatePreparing();
}
@Override
public void onStatePause() {
super.onStatePause();
if (callBack != null)
callBack.onPause();
}
@Override
public void onStateError() {
super.onStateError();
}
@Override
public void onStateAutoComplete() {
super.onStateAutoComplete();
curProgress = 100;
curPosition = getDuration();
if (callBack != null)
callBack.onComplete();
}
@Override
public void updateStartImage() {
if (state == STATE_PLAYING) {
startButton.setVisibility(VISIBLE);
startButton.setImageResource(cn.jzvd.R.drawable.jz_click_pause_selector);
replayTextView.setVisibility(GONE);
} else if (state == STATE_ERROR) {
startButton.setVisibility(INVISIBLE);
replayTextView.setVisibility(GONE);
} else if (state == STATE_AUTO_COMPLETE) {
startButton.setVisibility(VISIBLE);
startButton.setImageResource(cn.jzvd.R.drawable.jz_click_replay_selector);
replayTextView.setVisibility(VISIBLE);
} else {
startButton.setImageResource(cn.jzvd.R.drawable.jz_click_play_selector);
replayTextView.setVisibility(GONE);
if (state == 0 && callBack != null)
callBack.onPrepare();
}
}
public void setProgressTimes(long progressTimes) {
ToastUtils.showShortToast("set ptime: "+progressTimes);
mTouchingProgressBar = false;
dismissProgressDialog();
dismissVolumeDialog();
dismissBrightnessDialog();
mediaInterface.seekTo(progressTimes);
long duration = getDuration();
int progress = (int) (progressTimes * 100 / (duration == 0 ? 1 : duration));
progressBar.setProgress(progress);
startProgressTimer();
}
public void setPlayCallBack(PlayCallBack callBack) {
this.callBack = callBack;
}
public interface PlayCallBack {
void onstart();
void onPrepare();
void onPause();
void onComplete();
}
}
......@@ -2,6 +2,7 @@ package com.dayu.widgets;
import android.app.Activity;
import android.app.Dialog;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
......@@ -33,6 +34,43 @@ public class TextDialog {
}
public void showBottomDialog(final Activity activity, List<String> strs,onItemClickListener listener) {
View mView = View.inflate(activity, R.layout.dialog_text_bottom , null);
RecyclerView recyclerView = mView.findViewById(R.id.rv_text);
BaseQuickAdapter<String,BaseViewHolder> mAdapter = new BaseQuickAdapter<String, BaseViewHolder>
(R.layout.item_dialog_text_bottom,strs) {
@Override
protected void convert(BaseViewHolder helper, String item) {
helper.setText(R.id.tv_text,item);
}
};
recyclerView.setLayoutManager(new LinearLayoutManager(activity));
recyclerView.setAdapter(mAdapter);
recyclerView.addItemDecoration(new DividerItemDecoration(activity,DividerItemDecoration.VERTICAL));
Dialog textDialog = new Dialog(activity, R.style.CustomDialog);
textDialog.setContentView(mView);
Window window = textDialog.getWindow();
WindowManager.LayoutParams wl = window.getAttributes();
wl.width = ViewGroup.LayoutParams.MATCH_PARENT;
wl.height = ViewGroup.LayoutParams.WRAP_CONTENT;
wl.gravity = Gravity.BOTTOM;
textDialog.onWindowAttributesChanged(wl);
textDialog.show();
textDialog.setCanceledOnTouchOutside(true);
textDialog.setCancelable(true);
mAdapter.setOnItemClickListener((adapter,view,pos)->{
if (listener != null){
listener.onClick(pos);
}
textDialog.dismiss();
});
}
public void showCenterDialog(final Activity activity, List<String> strs,onItemClickListener listener) {
View mView = View.inflate(activity, R.layout.dialog_text , null);
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="#333"
/>
<corners android:radius="0.5dp"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="@color/common_text_color"/>
<corners android:radius="5dp"/>
<solid android:color="@color/cl_white"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="3dp"/>
<corners android:radius="5dp"/>
<solid android:color="@color/cl_receiving_order_item_data"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="3dp"/>
<corners android:radius="5dp"/>
<solid android:color="@color/cl_line"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="5dp"/>
<solid android:color="#aaa"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="3dp"/>
<corners android:radius="5dp"/>
<solid android:color="@color/text_common_green"/>
</shape>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="8dp"/>
<solid android:color="@color/color_f2"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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">
<com.cjt2325.cameralibrary.JCameraView
android:id="@+id/jcameraview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:duration_max="180000"
app:iconLeft="@drawable/ic_back"
app:iconMargin="20dp"
app:iconRight="@null"
app:iconSize="30dp"
app:iconSrc="@drawable/ic_camera" />
</LinearLayout>
......@@ -2,6 +2,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_text"
android:background="@color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:overScrollMode="never"
/>
</LinearLayout>
\ No newline at end of file
......@@ -5,7 +5,7 @@
<variable
name="item"
type="com.dayu.order.api.protocol.CommentBean" />
type="com.dayu.base.api.protocol.CommentBean" />
</data>
<LinearLayout
......
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:gravity="center"
android:padding="10dp"
android:text='aaa'
android:textColor="@color/cl_home_title_text_color"
......
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="20dp"
android:text='aaa'
android:textColor="@color/cl_home_title_text_color"
android:textSize="@dimen/sp_14" />
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tabtext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textStyle="bold"
android:textSize="30sp"
android:textColor="#585858"
/>
<TextView
android:id="@+id/tabicon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#585858"
android:textSize="13.3sp"
android:layout_gravity="center"/>
</LinearLayout>
\ No newline at end of file
......@@ -80,6 +80,7 @@
<string name="tv_about_us">扫码关注我们的微信服务号</string>
<string name="tv_about_us_text">&#160;&#160;&#160;&#160;传统低效的客服体系,正在成为厂商、服务商、消费者的包袱。大鱼准备以科技之力进行客服产业革命。运用Ai、云和大数据等技术,连接厂商、销售商、服务商和消费者,打造去中心化的智能共享客户服务解决方案。</string>
<string name="tv_about_dayu">大鱼创想&#160;&#160;版权所有</string>
<string name="tv_now_version">当前版本:</string>
<string name="tv_about_user_feiyong">收取费用</string>
<string name="tv_order_updoor_feiyong">上门费</string>
<string name="tv_order_serve_feiyong">服务费用</string>
......@@ -148,6 +149,8 @@
<string name="notice">提示</string>
<string name="no_permission">没有此权限将无法使用本app,请在设置中打开权限!</string>
<string name="login_state_no">登录状态已失效,请重新登录!</string>
<string name="delete_this_video">确定要删除该视频吗?</string>
<string name="confirm_str">确认</string>
<string name="login_again">重新登录</string>
<string name="submit_again">重新提交</string>
<string name="go_certification">去认证</string>
......@@ -256,7 +259,7 @@
<string name="server_record">服务记录</string>
<!--<string name="order_part">备件信息</string>-->
<string name="order_part">备件物流</string>
<string name="return_one_order_part">备件寄回商家</string>
<string name="return_one_order_part">我要向商家发货</string>
<string name="apply_one_order_part">向商家申请备件</string>
<string name="order_instruction">视频操作指南</string>
<string name="open_webview">浏览器打开</string>
......@@ -279,8 +282,8 @@
<string name="order_save_success">数据保存成功</string>
<string name="no_data">暂无数据</string>
<string name="dayu_platform">大鱼平台</string>
<string name="application_order_part">申请/收货</string>
<string name="return_order_part">返厂/发货</string>
<string name="application_order_part">收货</string>
<string name="return_order_part">发货</string>
<string name="return_order_part_title">寄回备件</string>
<string name="ka_address">收货地址</string>
<string name="ka_name">收货人名</string>
......@@ -804,7 +807,7 @@ C) 在甲方使用大鱼平å°æœåŠ¡è¿‡ç¨‹ä¸­äº§ç”Ÿçš„业务数æ®ï¼Œå®¢æˆ·æ•°æ
<string name="sale_collect">重点收藏</string>
<string name="in_sale">销售中</string>
<string name="sale_done">已完成</string>
<string name="input_sale_product">输入您要找的商品</string>
<string name="input_sale_product">查找商品</string>
<string name="input_sale_order">查找销售订单</string>
<string name="brand_model">品名:</string>
<string name="sale_single_price">单价:</string>
......@@ -824,6 +827,7 @@ C) 在甲方使用大鱼平å°æœåŠ¡è¿‡ç¨‹ä¸­äº§ç”Ÿçš„业务数æ®ï¼Œå®¢æˆ·æ•°æ
<string name="goods_company">商品所属商家:</string>
<string name="goods_pn">商品编号PN:</string>
<string name="goods_single_price">商品销售单价:</string>
<string name="goods_market_price">市场售价:</string>
<string name="goods_desc">主要功能简介:</string>
<string name="goods_video">商品展示视频:</string>
<string name="advice_seller">咨询商家</string>
......@@ -973,7 +977,6 @@ C) 在甲方使用大鱼平å°æœåŠ¡è¿‡ç¨‹ä¸­äº§ç”Ÿçš„业务数æ®ï¼Œå®¢æˆ·æ•°æ
<string name="save_str">保存</string>
<string name="save_success">保存成功</string>
<string name="save_fail">保存失败</string>
<string name="record_income_total">收入总额(元)</string>
<string name="record_reward_total">收入总额(元)</string>
<string name="record_done_service">完成服务工单</string>
......@@ -983,5 +986,35 @@ C) 在甲方使用大鱼平å°æœåŠ¡è¿‡ç¨‹ä¸­äº§ç”Ÿçš„业务数æ®ï¼Œå®¢æˆ·æ•°æ
<string name="city_str"></string>
<string name="zone_str">区/县</string>
<!-- learn -->
<string name="learn_title">学习交流</string>
<string name="learn_str">学习</string>
<string name="find_course">查找课程</string>
<array name="learn_top_tab_item">
<item>公开课</item>
<item>已学习</item>
<item>已发布</item>
</array>
<string name="pub_course_title">我要开课</string>
<string name="course_theme">课程主题:</string>
<string name="pls_input_course_theme">请填写课程主题</string>
<string name="course_desc">课程简介:</string>
<string name="pls_input_course_desc">请填写课程简介</string>
<string name="upload_video">上传视频:</string>
<string name="pls_choose_video">请选择视频</string>
<string name="learn_tips">温馨提示:</string>
<string name="learn_tip1">1、建议横屏拍摄视频,长度不超过3分钟,以方便师傅们在手机上观看。</string>
<string name="learn_tip2">2、请勿发布反动和涉黄内容的视频,平台有权下架并追究发布者的法律责任。</string>
<string name="learn_tip3">3、大鱼平台将对优质课程(点赞数)和热门课程(阅读数)的发布者进行现金奖励。</string>
<string name="confirm_pub">确认发布</string>
<string name="limit_10_words">限10个字</string>
<string name="limit_100_words">限100字</string>
<string name="course_detail">课程详情</string>
<string name="course_puber">发布方:</string>
<string name="moment_take_photo">轻触拍照, 按住摄像</string>
<string name="moment_take_video">点击开始录制</string>
<string name="moment_permission_4">应用需要录音权限来拍摄视频</string>
<string name="request_permission_failure">获取权限失败</string>
</resources>
......@@ -85,6 +85,42 @@
<item name="android:background">@drawable/bg_input_gray_react</item>
</style>
<style name="learn_course_edit" parent="common_text_style">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">35dp</item>
<item name="android:padding">3dp</item>
<item name="android:layout_marginLeft">10dp</item>
<item name="android:gravity">left|center_vertical</item>
<item name="android:background">@drawable/bg_input_gray_react</item>
</style>
<style name="ll_course_content" parent="common_text_style">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:orientation">horizontal</item>
<item name="android:layout_marginTop">10dp</item>
<item name="android:layout_marginLeft">5dp</item>
<item name="android:layout_marginRight">5dp</item>
</style>
<style name="tv_course_left" parent="common_text_style">
<item name="android:layout_width">60dp</item>
<item name="android:gravity">right</item>
</style>
<style name="tv_course_content" parent="common_text_style">
<item name="android:layout_marginLeft">15dp</item>
<item name="android:textColor">#8b8b8b</item>
</style>
<style name="tv_part_content" parent="common_text_style">
<item name="android:layout_marginLeft">15dp</item>
</style>
<style name="ll_part_content" parent="ll_course_content">
<item name="android:layout_marginLeft">10dp</item>
</style>
<style name="sale_item_text" parent="common_text_style">
<item name="android:maxLines">1</item>
</style>
......@@ -150,15 +186,27 @@
<item name="android:maxLines">1</item>
</style>
<style name="btn_bottom_common">
<item name="android:layout_width">match_parent</item>
<style name="btn_common">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">45dp</item>
<item name="android:background">@drawable/tab_blue_react</item>
<item name="android:textColor">@color/white</item>
<item name="android:gravity">center</item>
<item name="android:textSize">16sp</item>
</style>
<style name="btn_bottom_common" parent="btn_common">
<item name="android:layout_width">match_parent</item>
<item name="android:background">@drawable/tab_blue_react</item>
</style>
<style name="btn_common_gray" parent="btn_common">
<item name="android:background">@drawable/btn_grayaa_commom</item>
</style>
<style name="btn_common_blue" parent="btn_common">
<item name="android:background">@drawable/tab_blue_react</item>
</style>
<style name="title">
<item name="android:layout_width">match_parent</item>
......
......@@ -5,10 +5,10 @@ buildscript {
ext.build_tools_version = "27.0.3"
ext.min_sdk_version = 16
ext.target_sdk_version = 26
ext.version_code = 247
ext.verson_name = "2.4.7"
ext.version_code = 250
ext.verson_name = "2.5.0"
ext.gradle_version = '3.1.4'
ext.isReleaseMinify = true
ext.isReleaseMinify = false
ext.isDebugMinify = false
ext.arouter_api_version = '1.3.1'
ext.arouter_compiler_version = '1.1.4'
......
apply plugin: 'com.android.library'
android {
compileSdkVersion compile_sdk_version
buildToolsVersion build_tools_version
defaultConfig {
minSdkVersion min_sdk_version
targetSdkVersion target_sdk_version
versionCode version_code
versionName verson_name
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled isReleaseMinify
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
api 'com.android.support:design:27.1.1'
// api project(':apt')
}
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in D:\AndroidStudio\AndroidSDK/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
package com.cjt2325.cameralibrary;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
*/
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
}
\ No newline at end of file
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cjt2325.cameralibrary">
<application android:allowBackup="true" android:label="@string/app_name"
android:supportsRtl="true">
</application>
</manifest>
package com.cjt2325.cameralibrary;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import com.cjt2325.cameralibrary.util.ScreenUtils;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/4/26
* 描 述:对焦框
* =====================================
*/
public class FoucsView extends View {
private int size;
private int center_x;
private int center_y;
private int length;
private Paint mPaint;
public FoucsView(Context context) {
this(context, null);
}
public FoucsView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public FoucsView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.size = ScreenUtils.getScreenWidth(context) / 3;
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(0xEE16AE16);
mPaint.setStrokeWidth(4);
mPaint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
center_x = (int) (size / 2.0);
center_y = (int) (size / 2.0);
length = (int) (size / 2.0) - 2;
setMeasuredDimension(size, size);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(center_x - length, center_y - length, center_x + length, center_y + length, mPaint);
canvas.drawLine(2, getHeight() / 2, size / 10, getHeight() / 2, mPaint);
canvas.drawLine(getWidth() - 2, getHeight() / 2, getWidth() - size / 10, getHeight() / 2, mPaint);
canvas.drawLine(getWidth() / 2, 2, getWidth() / 2, size / 10, mPaint);
canvas.drawLine(getWidth() / 2, getHeight() - 2, getWidth() / 2, getHeight() - size / 10, mPaint);
}
}
package com.cjt2325.cameralibrary;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.View;
/**
* =====================================
* 作 者: 陈嘉桐 445263848@qq.com
* 版 本:1.0.4
* 创建日期:2017/4/26
* 描 述:向下箭头的退出按钮
* =====================================
*/
public class ReturnButton extends View {
private int size;
private int center_X;
private int center_Y;
private float strokeWidth;
private Paint paint;
Path path;
public ReturnButton(Context context, int size) {
this(context);
this.size = size;
center_X = size / 2;
center_Y = size / 2;
strokeWidth = size / 15f;
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(strokeWidth);
path = new Path();
}
public ReturnButton(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(size, size / 2);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
path.moveTo(strokeWidth, strokeWidth/2);
path.lineTo(center_X, center_Y - strokeWidth/2);
path.lineTo(size - strokeWidth, strokeWidth/2);
canvas.drawPath(path, paint);
}
}
package com.cjt2325.cameralibrary;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.view.View;
/**
* =====================================
* 作 者: 陈嘉桐 445263848@qq.com
* 版 本:1.0.4
* 创建日期:2017/4/26
* 描 述:拍照或录制完成后弹出的确认和返回按钮
* =====================================
*/
public class TypeButton extends View{
public static final int TYPE_CANCEL = 0x001;
public static final int TYPE_CONFIRM = 0x002;
private int button_type;
private int button_size;
private float center_X;
private float center_Y;
private float button_radius;
private Paint mPaint;
private Path path;
private float strokeWidth;
private float index;
private RectF rectF;
public TypeButton(Context context) {
super(context);
}
public TypeButton(Context context, int type, int size) {
super(context);
this.button_type = type;
button_size = size;
button_radius = size / 2.0f;
center_X = size / 2.0f;
center_Y = size / 2.0f;
mPaint = new Paint();
path = new Path();
strokeWidth = size / 50f;
index = button_size / 12f;
rectF = new RectF(center_X, center_Y - index, center_X + index * 2, center_Y + index);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(button_size, button_size);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//如果类型为取消,则绘制内部为返回箭头
if (button_type == TYPE_CANCEL) {
mPaint.setAntiAlias(true);
mPaint.setColor(0xEEDCDCDC);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(center_X, center_Y, button_radius, mPaint);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(strokeWidth);
path.moveTo(center_X - index / 7, center_Y + index);
path.lineTo(center_X + index, center_Y + index);
path.arcTo(rectF, 90, -180);
path.lineTo(center_X - index, center_Y - index);
canvas.drawPath(path, mPaint);
mPaint.setStyle(Paint.Style.FILL);
path.reset();
path.moveTo(center_X - index, (float) (center_Y - index * 1.5));
path.lineTo(center_X - index, (float) (center_Y - index / 2.3));
path.lineTo((float) (center_X - index * 1.6), center_Y - index);
path.close();
canvas.drawPath(path, mPaint);
}
//如果类型为确认,则绘制绿色勾
if (button_type == TYPE_CONFIRM) {
mPaint.setAntiAlias(true);
mPaint.setColor(0xFFFFFFFF);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(center_X, center_Y, button_radius, mPaint);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(0xFF00CC00);
mPaint.setStrokeWidth(strokeWidth);
path.moveTo(center_X - button_size / 6f, center_Y);
path.lineTo(center_X - button_size / 21.2f, center_Y + button_size / 7.7f);
path.lineTo(center_X + button_size / 4.0f, center_Y - button_size / 8.5f);
path.lineTo(center_X - button_size / 21.2f, center_Y + button_size / 9.4f);
path.close();
canvas.drawPath(path, mPaint);
}
}
}
package com.cjt2325.cameralibrary.listener;
/**
* create by CJT2325
* 445263848@qq.com.
*/
public interface CaptureListener {
void takePictures();
void recordShort(long time);
void recordStart();
void recordEnd(long time);
void recordZoom(float zoom);
void recordError();
}
package com.cjt2325.cameralibrary.listener;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.9
* 创建日期:2017/10/7
* 描 述:
* =====================================
*/
public interface ClickListener {
void onClick();
}
package com.cjt2325.cameralibrary.listener;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/6/5
* 描 述:
* =====================================
*/
public interface ErrorListener {
void onError();
void AudioPermissionError();
}
package com.cjt2325.cameralibrary.listener;
import android.graphics.Bitmap;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/4/26
* 描 述:
* =====================================
*/
public interface JCameraListener {
void captureSuccess(Bitmap bitmap);
void recordSuccess(String url, Bitmap firstFrame);
}
package com.cjt2325.cameralibrary.listener;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/9/8
* 描 述:
* =====================================
*/
public interface ResultListener {
void callback();
}
package com.cjt2325.cameralibrary.listener;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/4/26
* 描 述:
* =====================================
*/
public interface ReturnListener {
void onReturn();
}
package com.cjt2325.cameralibrary.listener;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/4/25
* 描 述:
* =====================================
*/
public interface TypeListener {
void cancel();
void confirm();
}
package com.cjt2325.cameralibrary.state;
import android.view.Surface;
import android.view.SurfaceHolder;
import com.cjt2325.cameralibrary.CameraInterface;
import com.cjt2325.cameralibrary.JCameraView;
import com.cjt2325.cameralibrary.util.LogUtil;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/9/8
* 描 述:
* =====================================
*/
public class BorrowPictureState implements State {
private final String TAG = "BorrowPictureState";
private CameraMachine machine;
public BorrowPictureState(CameraMachine machine) {
this.machine = machine;
}
@Override
public void start(SurfaceHolder holder, float screenProp) {
CameraInterface.getInstance().doStartPreview(holder, screenProp);
machine.setState(machine.getPreviewState());
}
@Override
public void stop() {
}
@Override
public void foucs(float x, float y, CameraInterface.FocusCallback callback) {
}
@Override
public void swtich(SurfaceHolder holder, float screenProp) {
}
@Override
public void restart() {
}
@Override
public void capture() {
}
@Override
public void record(Surface surface,float screenProp) {
}
@Override
public void stopRecord(boolean isShort, long time) {
}
@Override
public void cancle(SurfaceHolder holder, float screenProp) {
CameraInterface.getInstance().doStartPreview(holder, screenProp);
machine.getView().resetState(JCameraView.TYPE_PICTURE);
machine.setState(machine.getPreviewState());
}
@Override
public void confirm() {
machine.getView().confirmState(JCameraView.TYPE_PICTURE);
machine.setState(machine.getPreviewState());
}
@Override
public void zoom(float zoom, int type) {
LogUtil.i(TAG, "zoom");
}
@Override
public void flash(String mode) {
}
}
package com.cjt2325.cameralibrary.state;
import android.view.Surface;
import android.view.SurfaceHolder;
import com.cjt2325.cameralibrary.CameraInterface;
import com.cjt2325.cameralibrary.JCameraView;
import com.cjt2325.cameralibrary.util.LogUtil;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/9/8
* 描 述:
* =====================================
*/
public class BorrowVideoState implements State {
private final String TAG = "BorrowVideoState";
private CameraMachine machine;
public BorrowVideoState(CameraMachine machine) {
this.machine = machine;
}
@Override
public void start(SurfaceHolder holder, float screenProp) {
CameraInterface.getInstance().doStartPreview(holder, screenProp);
machine.setState(machine.getPreviewState());
}
@Override
public void stop() {
}
@Override
public void foucs(float x, float y, CameraInterface.FocusCallback callback) {
}
@Override
public void swtich(SurfaceHolder holder, float screenProp) {
}
@Override
public void restart() {
}
@Override
public void capture() {
}
@Override
public void record(Surface surface, float screenProp) {
}
@Override
public void stopRecord(boolean isShort, long time) {
}
@Override
public void cancle(SurfaceHolder holder, float screenProp) {
machine.getView().resetState(JCameraView.TYPE_VIDEO);
machine.setState(machine.getPreviewState());
}
@Override
public void confirm() {
machine.getView().confirmState(JCameraView.TYPE_VIDEO);
machine.setState(machine.getPreviewState());
}
@Override
public void zoom(float zoom, int type) {
LogUtil.i(TAG, "zoom");
}
@Override
public void flash(String mode) {
}
}
package com.cjt2325.cameralibrary.state;
import android.content.Context;
import android.view.Surface;
import android.view.SurfaceHolder;
import com.cjt2325.cameralibrary.CameraInterface;
import com.cjt2325.cameralibrary.view.CameraView;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/9/8
* 描 述:
* =====================================
*/
public class CameraMachine implements State {
private Context context;
private State state;
private CameraView view;
// private CameraInterface.CameraOpenOverCallback cameraOpenOverCallback;
private State previewState; //浏览状态(空闲)
private State borrowPictureState; //浏览图片
private State borrowVideoState; //浏览视频
public CameraMachine(Context context, CameraView view, CameraInterface.CameraOpenOverCallback
cameraOpenOverCallback) {
this.context = context;
previewState = new PreviewState(this);
borrowPictureState = new BorrowPictureState(this);
borrowVideoState = new BorrowVideoState(this);
//默认设置为空闲状态
this.state = previewState;
// this.cameraOpenOverCallback = cameraOpenOverCallback;
this.view = view;
}
public CameraView getView() {
return view;
}
public Context getContext() {
return context;
}
public void setState(State state) {
this.state = state;
}
//获取浏览图片状态
State getBorrowPictureState() {
return borrowPictureState;
}
//获取浏览视频状态
State getBorrowVideoState() {
return borrowVideoState;
}
//获取空闲状态
State getPreviewState() {
return previewState;
}
@Override
public void start(SurfaceHolder holder, float screenProp) {
state.start(holder, screenProp);
}
@Override
public void stop() {
state.stop();
}
@Override
public void foucs(float x, float y, CameraInterface.FocusCallback callback) {
state.foucs(x, y, callback);
}
@Override
public void swtich(SurfaceHolder holder, float screenProp) {
state.swtich(holder, screenProp);
}
@Override
public void restart() {
state.restart();
}
@Override
public void capture() {
state.capture();
}
@Override
public void record(Surface surface, float screenProp) {
state.record(surface, screenProp);
}
@Override
public void stopRecord(boolean isShort, long time) {
state.stopRecord(isShort, time);
}
@Override
public void cancle(SurfaceHolder holder, float screenProp) {
state.cancle(holder, screenProp);
}
@Override
public void confirm() {
state.confirm();
}
@Override
public void zoom(float zoom, int type) {
state.zoom(zoom, type);
}
@Override
public void flash(String mode) {
state.flash(mode);
}
public State getState() {
return this.state;
}
}
package com.cjt2325.cameralibrary.state;
import android.graphics.Bitmap;
import android.view.Surface;
import android.view.SurfaceHolder;
import com.cjt2325.cameralibrary.CameraInterface;
import com.cjt2325.cameralibrary.JCameraView;
import com.cjt2325.cameralibrary.util.LogUtil;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/9/8
* 描 述:空闲状态
* =====================================
*/
class PreviewState implements State {
public static final String TAG = "PreviewState";
private CameraMachine machine;
PreviewState(CameraMachine machine) {
this.machine = machine;
}
@Override
public void start(SurfaceHolder holder, float screenProp) {
CameraInterface.getInstance().doStartPreview(holder, screenProp);
}
@Override
public void stop() {
CameraInterface.getInstance().doStopPreview();
}
@Override
public void foucs(float x, float y, CameraInterface.FocusCallback callback) {
LogUtil.i("preview state foucs");
if (machine.getView().handlerFoucs(x, y)) {
CameraInterface.getInstance().handleFocus(machine.getContext(), x, y, callback);
}
}
@Override
public void swtich(SurfaceHolder holder, float screenProp) {
CameraInterface.getInstance().switchCamera(holder, screenProp);
}
@Override
public void restart() {
}
@Override
public void capture() {
CameraInterface.getInstance().takePicture(new CameraInterface.TakePictureCallback() {
@Override
public void captureResult(Bitmap bitmap, boolean isVertical) {
machine.getView().showPicture(bitmap, isVertical);
machine.setState(machine.getBorrowPictureState());
LogUtil.i("capture");
}
});
}
@Override
public void record(Surface surface, float screenProp) {
CameraInterface.getInstance().startRecord(surface, screenProp, null);
}
@Override
public void stopRecord(final boolean isShort, long time) {
CameraInterface.getInstance().stopRecord(isShort, new CameraInterface.StopRecordCallback() {
@Override
public void recordResult(String url, Bitmap firstFrame) {
if (isShort) {
machine.getView().resetState(JCameraView.TYPE_SHORT);
} else {
machine.getView().playVideo(firstFrame, url);
machine.setState(machine.getBorrowVideoState());
}
}
});
}
@Override
public void cancle(SurfaceHolder holder, float screenProp) {
LogUtil.i("浏览状态下,没有 cancle 事件");
}
@Override
public void confirm() {
LogUtil.i("浏览状态下,没有 confirm 事件");
}
@Override
public void zoom(float zoom, int type) {
LogUtil.i(TAG, "zoom");
CameraInterface.getInstance().setZoom(zoom, type);
}
@Override
public void flash(String mode) {
CameraInterface.getInstance().setFlashMode(mode);
}
}
package com.cjt2325.cameralibrary.state;
import android.view.Surface;
import android.view.SurfaceHolder;
import com.cjt2325.cameralibrary.CameraInterface;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/9/8
* 描 述:
* =====================================
*/
public interface State {
void start(SurfaceHolder holder, float screenProp);
void stop();
void foucs(float x, float y, CameraInterface.FocusCallback callback);
void swtich(SurfaceHolder holder, float screenProp);
void restart();
void capture();
void record(Surface surface, float screenProp);
void stopRecord(boolean isShort, long time);
void cancle(SurfaceHolder holder, float screenProp);
void confirm();
void zoom(float zoom, int type);
void flash(String mode);
}
package com.cjt2325.cameralibrary.util;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/5/2
* 描 述:
* =====================================
*/
public class AngleUtil {
public static int getSensorAngle(float x, float y) {
if (Math.abs(x) > Math.abs(y)) {
/**
* 横屏倾斜角度比较大
*/
if (x > 4) {
/**
* 左边倾斜
*/
return 270;
} else if (x < -4) {
/**
* 右边倾斜
*/
return 90;
} else {
/**
* 倾斜角度不够大
*/
return 0;
}
} else {
if (y > 7) {
/**
* 左边倾斜
*/
return 0;
} else if (y < -7) {
/**
* 右边倾斜
*/
return 180;
} else {
/**
* 倾斜角度不够大
*/
return 0;
}
}
}
}
package com.cjt2325.cameralibrary.util;
import android.content.Context;
import android.media.AudioManager;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/4/26
* 描 述:
* =====================================
*/
public class AudioUtil {
public static void setAudioManage(Context context) {
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);
audioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, 0, 0);
audioManager.setStreamVolume(AudioManager.STREAM_DTMF, 0, 0);
audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, 0, 0);
audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0);
}
}
package com.cjt2325.cameralibrary.util;
import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.Surface;
import android.view.WindowManager;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/4/25
* 描 述:
* =====================================
*/
public class CameraParamUtil {
private static final String TAG = "JCameraView";
private CameraSizeComparator sizeComparator = new CameraSizeComparator();
private static CameraParamUtil cameraParamUtil = null;
private CameraParamUtil() {
}
public static CameraParamUtil getInstance() {
if (cameraParamUtil == null) {
cameraParamUtil = new CameraParamUtil();
return cameraParamUtil;
} else {
return cameraParamUtil;
}
}
public Camera.Size getPreviewSize(List<Camera.Size> list, int th, float rate) {
Collections.sort(list, sizeComparator);
int i = 0;
for (Camera.Size s : list) {
if ((s.width > th) && equalRate(s, rate)) {
Log.i(TAG, "MakeSure Preview :w = " + s.width + " h = " + s.height);
break;
}
i++;
}
if (i == list.size()) {
return getBestSize(list, rate);
} else {
return list.get(i);
}
}
public Camera.Size getPictureSize(List<Camera.Size> list, int th, float rate) {
Collections.sort(list, sizeComparator);
int i = 0;
for (Camera.Size s : list) {
if ((s.width > th) && equalRate(s, rate)) {
Log.i(TAG, "MakeSure Picture :w = " + s.width + " h = " + s.height);
break;
}
i++;
}
if (i == list.size()) {
return getBestSize(list, rate);
} else {
return list.get(i);
}
}
private Camera.Size getBestSize(List<Camera.Size> list, float rate) {
float previewDisparity = 100;
int index = 0;
for (int i = 0; i < list.size(); i++) {
Camera.Size cur = list.get(i);
float prop = (float) cur.width / (float) cur.height;
if (Math.abs(rate - prop) < previewDisparity) {
previewDisparity = Math.abs(rate - prop);
index = i;
}
}
return list.get(index);
}
private boolean equalRate(Camera.Size s, float rate) {
float r = (float) (s.width) / (float) (s.height);
return Math.abs(r - rate) <= 0.2;
}
public boolean isSupportedFocusMode(List<String> focusList, String focusMode) {
for (int i = 0; i < focusList.size(); i++) {
if (focusMode.equals(focusList.get(i))) {
Log.i(TAG, "FocusMode supported " + focusMode);
return true;
}
}
Log.i(TAG, "FocusMode not supported " + focusMode);
return false;
}
public boolean isSupportedPictureFormats(List<Integer> supportedPictureFormats, int jpeg) {
for (int i = 0; i < supportedPictureFormats.size(); i++) {
if (jpeg == supportedPictureFormats.get(i)) {
Log.i(TAG, "Formats supported " + jpeg);
return true;
}
}
Log.i(TAG, "Formats not supported " + jpeg);
return false;
}
private class CameraSizeComparator implements Comparator<Camera.Size> {
public int compare(Camera.Size lhs, Camera.Size rhs) {
if (lhs.width == rhs.width) {
return 0;
} else if (lhs.width > rhs.width) {
return 1;
} else {
return -1;
}
}
}
public int getCameraDisplayOrientation(Context context, int cameraId) {
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
int rotation = wm.getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else {
// back-facing
result = (info.orientation - degrees + 360) % 360;
}
return result;
}
}
package com.cjt2325.cameralibrary.util;
import android.hardware.Camera;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/6/8
* 描 述:
* =====================================
*/
public class CheckPermission {
public static final int STATE_RECORDING = -1;
public static final int STATE_NO_PERMISSION = -2;
public static final int STATE_SUCCESS = 1;
/**
* 用于检测是否具有录音权限
*
* @return
*/
public static int getRecordState() {
int minBuffer = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat
.ENCODING_PCM_16BIT);
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 44100, AudioFormat
.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, (minBuffer * 100));
short[] point = new short[minBuffer];
int readSize = 0;
try {
audioRecord.startRecording();//检测是否可以进入初始化状态
} catch (Exception e) {
if (audioRecord != null) {
audioRecord.release();
audioRecord = null;
}
return STATE_NO_PERMISSION;
}
if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
//6.0以下机型都会返回此状态,故使用时需要判断bulid版本
//检测是否在录音中
if (audioRecord != null) {
audioRecord.stop();
audioRecord.release();
audioRecord = null;
Log.d("CheckAudioPermission", "录音机被占用");
}
return STATE_RECORDING;
} else {
//检测是否可以获取录音结果
readSize = audioRecord.read(point, 0, point.length);
if (readSize <= 0) {
if (audioRecord != null) {
audioRecord.stop();
audioRecord.release();
audioRecord = null;
}
Log.d("CheckAudioPermission", "录音的结果为空");
return STATE_NO_PERMISSION;
} else {
if (audioRecord != null) {
audioRecord.stop();
audioRecord.release();
audioRecord = null;
}
return STATE_SUCCESS;
}
}
}
public synchronized static boolean isCameraUseable(int cameraID) {
boolean canUse = true;
Camera mCamera = null;
try {
mCamera = Camera.open(cameraID);
// setParameters 是针对魅族MX5。MX5通过Camera.open()拿到的Camera对象不为null
Camera.Parameters mParameters = mCamera.getParameters();
mCamera.setParameters(mParameters);
} catch (Exception e) {
e.printStackTrace();
canUse = false;
} finally {
if (mCamera != null) {
mCamera.release();
} else {
canUse = false;
}
mCamera = null;
}
return canUse;
}
}
\ No newline at end of file
package com.cjt2325.cameralibrary.util;
import android.os.Build;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/6/9
* 描 述:
* =====================================
*/
public class DeviceUtil {
private static String[] huaweiRongyao = {
"hwH60", //荣耀6
"hwPE", //荣耀6 plus
"hwH30", //3c
"hwHol", //3c畅玩版
"hwG750", //3x
"hw7D", //x1
"hwChe2", //x1
};
public static String getDeviceInfo() {
String handSetInfo =
"手机型号:" + Build.DEVICE +
"\n系统版本:" + Build.VERSION.RELEASE +
"\nSDK版本:" + Build.VERSION.SDK_INT;
return handSetInfo;
}
public static String getDeviceModel() {
return Build.DEVICE;
}
public static boolean isHuaWeiRongyao() {
int length = huaweiRongyao.length;
for (int i = 0; i < length; i++) {
if (huaweiRongyao[i].equals(getDeviceModel())) {
return true;
}
}
return false;
}
}
package com.cjt2325.cameralibrary.util;
import android.graphics.Bitmap;
import android.os.Environment;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/4/25
* 描 述:
* =====================================
*/
public class FileUtil {
private static final String TAG = "CJT";
private static final File parentPath = Environment.getExternalStorageDirectory();
private static String storagePath = "";
private static String DST_FOLDER_NAME = "JCamera";
private static String initPath() {
if (storagePath.equals("")) {
storagePath = parentPath.getAbsolutePath() + File.separator + DST_FOLDER_NAME;
File f = new File(storagePath);
if (!f.exists()) {
f.mkdir();
}
}
return storagePath;
}
public static String saveBitmap(String dir, Bitmap b) {
DST_FOLDER_NAME = dir;
String path = initPath();
long dataTake = System.currentTimeMillis();
String jpegName = path + File.separator + "picture_" + dataTake + ".jpg";
try {
FileOutputStream fout = new FileOutputStream(jpegName);
BufferedOutputStream bos = new BufferedOutputStream(fout);
b.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
return jpegName;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
public static boolean deleteFile(String url) {
boolean result = false;
File file = new File(url);
if (file.exists()) {
result = file.delete();
}
return result;
}
public static boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
}
package com.cjt2325.cameralibrary.util;
import android.util.Log;
import static com.cjt2325.cameralibrary.BuildConfig.DEBUG;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/9/7
* 描 述:
* =====================================
*/
public class LogUtil {
private static final String DEFAULT_TAG = "CJT";
public static void i(String tag, String msg) {
// if (DEBUG)
Log.i(tag, msg);
}
public static void v(String tag, String msg) {
if (DEBUG)
Log.v(tag, msg);
}
public static void d(String tag, String msg) {
if (DEBUG)
Log.d(tag, msg);
}
public static void e(String tag, String msg) {
if (DEBUG)
Log.e(tag, msg);
}
public static void i(String msg) {
i(DEFAULT_TAG, msg);
}
public static void v(String msg) {
v(DEFAULT_TAG, msg);
}
public static void d(String msg) {
d(DEFAULT_TAG, msg);
}
public static void e(String msg) {
e(DEFAULT_TAG, msg);
}
}
package com.cjt2325.cameralibrary.util;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.WindowManager;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/5/25
* 描 述:
* =====================================
*/
public class ScreenUtils {
public static int screenWidth;
public static int screenHeight;
public static int getScreenHeight(Context context) {
DisplayMetrics metric = new DisplayMetrics();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metric);
screenHeight = metric.heightPixels;
return metric.heightPixels;
}
public static int getScreenWidth(Context context) {
DisplayMetrics metric = new DisplayMetrics();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metric);
screenWidth = metric.widthPixels;
return metric.widthPixels;
}
}
package com.cjt2325.cameralibrary.view;
import android.graphics.Bitmap;
/**
* =====================================
* 作 者: 陈嘉桐
* 版 本:1.1.4
* 创建日期:2017/9/8
* 描 述:
* =====================================
*/
public interface CameraView {
void resetState(int type);
void confirmState(int type);
void showPicture(Bitmap bitmap, boolean isVertical);
void playVideo(Bitmap firstFrame, String url);
void stopVideo();
void setTip(String tip);
void startPreviewCallback();
boolean handlerFoucs(float x, float y);
}
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M9,3L7.17,5L4,5c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,7c0,-1.1 -0.9,-2 -2,-2h-3.17L15,3L9,3zM12,18c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,17l1.25,-2.75L16,13l-2.75,-1.25L12,9l-1.25,2.75L8,13l2.75,1.25z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3,2v12h3v9l7,-12L9,11l4,-9L3,2zM19,2h-2l-3.2,9h1.9l0.7,-2h3.2l0.7,2h1.9L19,2zM16.85,7.65L18,4l1.15,3.65h-2.3z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3.27,3L2,4.27l5,5V13h3v9l3.58,-6.14L17.73,20 19,18.73 3.27,3zM17,10h-4l4,-8H7v2.18l8.46,8.46L17,10z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M7,2v11h3v9l7,-12h-4l4,-8z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
android:id="@+id/video_preview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/image_photo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000"
android:visibility="invisible"/>
</FrameLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:orientation="horizontal">
<ImageView
android:id="@+id/image_flash"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:src="@drawable/ic_flash_on"/>
<ImageView
android:id="@+id/image_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:src="@drawable/ic_camera"/>
</LinearLayout>
<com.cjt2325.cameralibrary.CaptureLayout
android:id="@+id/capture_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"/>
<com.cjt2325.cameralibrary.FoucsView
android:id="@+id/fouce_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="invisible"/>
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="iconSize" format="dimension"/>
<attr name="iconMargin" format="dimension"/>
<attr name="iconSrc" format="reference"/>
<attr name="iconLeft" format="reference"/>
<attr name="iconRight" format="reference"/>
<attr name="duration_max" format="integer"/>
<declare-styleable name="JCameraView">
<attr name="iconSize"/>
<attr name="iconMargin"/>
<attr name="iconSrc"/>
<attr name="iconLeft"/>
<attr name="iconRight"/>
<attr name="duration_max"/>
</declare-styleable>
</resources>
\ No newline at end of file
<resources>
<string name="app_name">CameraLibrary</string>
</resources>
package com.cjt2325.cameralibrary;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* To work on unit tests, switch the Test Artifact in the Build Variants view.
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
......@@ -9,6 +9,9 @@ isOrderModule=true
isManagerModule=true
##销售模块
isSaleModule=true
##培训模块
isLearnModule=true
##maven依赖
mavenMode=false
BASE_URL=http://47.94.101.239:3112
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment