Commit 135ed4bef681d6c9d326ca16813c57e86406da77
1 parent
0011be9e
1 新增电商
Showing
52 changed files
with
189 additions
and
2895 deletions
app/strike/src/main/AndroidManifest.xml
| @@ -17,6 +17,18 @@ | @@ -17,6 +17,18 @@ | ||
| 17 | android:roundIcon="@mipmap/ic_launcher_round" | 17 | android:roundIcon="@mipmap/ic_launcher_round" |
| 18 | android:supportsRtl="true" | 18 | android:supportsRtl="true" |
| 19 | android:theme="@style/AppTheme"> | 19 | android:theme="@style/AppTheme"> |
| 20 | + <provider | ||
| 21 | + android:name="androidx.core.content.FileProvider" | ||
| 22 | + android:authorities="${applicationId}.fileprovider" | ||
| 23 | + android:exported="false" | ||
| 24 | + android:grantUriPermissions="true" | ||
| 25 | + tools:replace="android:authorities"> | ||
| 26 | + <meta-data | ||
| 27 | + android:name="android.support.FILE_PROVIDER_PATHS" | ||
| 28 | + android:resource="@xml/app_files" | ||
| 29 | + tools:replace="android:resource" /> | ||
| 30 | + </provider> | ||
| 31 | + | ||
| 20 | <activity android:name="com.cnlive.strike.demo.activity.CNplayerActivity" /> | 32 | <activity android:name="com.cnlive.strike.demo.activity.CNplayerActivity" /> |
| 21 | <activity android:name="com.cnlive.strike.demo.activity.DemoAnimActivity" /> | 33 | <activity android:name="com.cnlive.strike.demo.activity.DemoAnimActivity" /> |
| 22 | <activity | 34 | <activity |
| @@ -37,6 +49,7 @@ | @@ -37,6 +49,7 @@ | ||
| 37 | 49 | ||
| 38 | <meta-data | 50 | <meta-data |
| 39 | android:name="com.baidu.lbsapi.API_KEY" | 51 | android:name="com.baidu.lbsapi.API_KEY" |
| 52 | + tools:replace="android:value" | ||
| 40 | android:value="${BAIDU_MAP_APP_KEY}" /> | 53 | android:value="${BAIDU_MAP_APP_KEY}" /> |
| 41 | <meta-data | 54 | <meta-data |
| 42 | android:name="com.baidu.speech.APP_ID" | 55 | android:name="com.baidu.speech.APP_ID" |
app/strike/src/main/java/com/cnlive/strike/MyApp.java
| @@ -29,6 +29,8 @@ public class MyApp extends BaseApplication { | @@ -29,6 +29,8 @@ public class MyApp extends BaseApplication { | ||
| 29 | //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型. | 29 | //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型. |
| 30 | //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。 | 30 | //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。 |
| 31 | SDKInitializer.setCoordType(CoordType.GCJ02); | 31 | SDKInitializer.setCoordType(CoordType.GCJ02); |
| 32 | + //初始化上海电商 | ||
| 33 | + cn.cnlive.b2c.AppApplication.initSDK(this); | ||
| 32 | } | 34 | } |
| 33 | 35 | ||
| 34 | 36 |
app/strike/src/main/java/com/cnlive/strike/demo/activity/CNplayerActivity.java
| @@ -57,7 +57,7 @@ public class CNplayerActivity extends BaseActivity implements IMediaPlayer.OnPre | @@ -57,7 +57,7 @@ public class CNplayerActivity extends BaseActivity implements IMediaPlayer.OnPre | ||
| 57 | QMUITipDialogUtil.loadingDialog(me,"直播"); | 57 | QMUITipDialogUtil.loadingDialog(me,"直播"); |
| 58 | // binding.videoview.setDataSource(new DataSource("604_233216be9552476b93d2c0cac7819222", Config.TYPE_LIVE, Config.TYPE_PLAY_RATE_2)); | 58 | // binding.videoview.setDataSource(new DataSource("604_233216be9552476b93d2c0cac7819222", Config.TYPE_LIVE, Config.TYPE_PLAY_RATE_2)); |
| 59 | // binding.videoview.setDataSource(new DataSource("223_b66053d9eaf147efa58eb1ae4b47661e", Config.TYPE_VOD, Config.TYPE_PLAY_RATE_2)); | 59 | // binding.videoview.setDataSource(new DataSource("223_b66053d9eaf147efa58eb1ae4b47661e", Config.TYPE_VOD, Config.TYPE_PLAY_RATE_2)); |
| 60 | - binding.videoview.setDataSource(new DataSource("604_75ca27cce3a043b1876f694dd1125234", Config.TYPE_LIVE, Config.TYPE_PLAY_RATE_2)); | 60 | + binding.videoview.setDataSource(new DataSource("604_maishicaijing", Config.TYPE_LIVE, Config.TYPE_PLAY_RATE_2)); |
| 61 | 61 | ||
| 62 | } | 62 | } |
| 63 | binding.videoview.start(); | 63 | binding.videoview.start(); |
app/strike/src/main/java/com/cnlive/strike/demo/activity/DemoMvpActivity.java
| @@ -5,10 +5,7 @@ import android.content.Intent; | @@ -5,10 +5,7 @@ import android.content.Intent; | ||
| 5 | import android.os.Handler; | 5 | import android.os.Handler; |
| 6 | import android.os.Message; | 6 | import android.os.Message; |
| 7 | import android.text.TextUtils; | 7 | import android.text.TextUtils; |
| 8 | -import android.view.LayoutInflater; | ||
| 9 | import android.view.View; | 8 | import android.view.View; |
| 10 | -import android.widget.LinearLayout; | ||
| 11 | -import android.widget.TextView; | ||
| 12 | 9 | ||
| 13 | import androidx.annotation.NonNull; | 10 | import androidx.annotation.NonNull; |
| 14 | import androidx.databinding.ViewDataBinding; | 11 | import androidx.databinding.ViewDataBinding; |
| @@ -23,8 +20,10 @@ import com.cnlive.cloud.user.ui.activity.PersonalDataActivity; | @@ -23,8 +20,10 @@ import com.cnlive.cloud.user.ui.activity.PersonalDataActivity; | ||
| 23 | import com.cnlive.cloud.wjjpay.pay.WjjPay; | 20 | import com.cnlive.cloud.wjjpay.pay.WjjPay; |
| 24 | import com.cnlive.cloud.xiaojiaspeaker.commonInfo.XiaoJIaCommInfo; | 21 | import com.cnlive.cloud.xiaojiaspeaker.commonInfo.XiaoJIaCommInfo; |
| 25 | import com.cnlive.cloud.xiaojiaspeaker.ui.activity.AllDeviceActivity; | 22 | import com.cnlive.cloud.xiaojiaspeaker.ui.activity.AllDeviceActivity; |
| 23 | +import com.cnlive.core.libs.base.arouter.user.CNLiveUserService; | ||
| 26 | import com.cnlive.core.libs.base.frame.activity.BaseActivity; | 24 | import com.cnlive.core.libs.base.frame.activity.BaseActivity; |
| 27 | import com.cnlive.core.libs.base.interfaces.OnPermissionResponseListener; | 25 | import com.cnlive.core.libs.base.interfaces.OnPermissionResponseListener; |
| 26 | +import com.cnlive.core.libs.base.util.OpenServiceHelpUtil; | ||
| 28 | import com.cnlive.core.libs.base.util.QMUITipDialogUtil; | 27 | import com.cnlive.core.libs.base.util.QMUITipDialogUtil; |
| 29 | import com.cnlive.core.libs.base.util.StatusBarConfig; | 28 | import com.cnlive.core.libs.base.util.StatusBarConfig; |
| 30 | import com.cnlive.core.network.HttpConn; | 29 | import com.cnlive.core.network.HttpConn; |
| @@ -33,7 +32,6 @@ import com.cnlive.core.network.model.BaseResult; | @@ -33,7 +32,6 @@ import com.cnlive.core.network.model.BaseResult; | ||
| 33 | import com.cnlive.core.network.request.BaseRequest; | 32 | import com.cnlive.core.network.request.BaseRequest; |
| 34 | import com.cnlive.moudle.pedometer.commonInfo.CommonInfo; | 33 | import com.cnlive.moudle.pedometer.commonInfo.CommonInfo; |
| 35 | import com.cnlive.moudle.pedometer.ui.activity.RunLineActivity; | 34 | import com.cnlive.moudle.pedometer.ui.activity.RunLineActivity; |
| 36 | -import com.cnlive.strike.MyApp; | ||
| 37 | import com.cnlive.strike.demo.activity.presenter.DemoActivityPresenter; | 35 | import com.cnlive.strike.demo.activity.presenter.DemoActivityPresenter; |
| 38 | import com.cnlive.strike.demo.activity.view.DemoActivityView; | 36 | import com.cnlive.strike.demo.activity.view.DemoActivityView; |
| 39 | import com.cnlive.strike.network.api.ApiService; | 37 | import com.cnlive.strike.network.api.ApiService; |
| @@ -403,6 +401,24 @@ public class DemoMvpActivity extends BaseActivity<DemoActivityView, DemoActivity | @@ -403,6 +401,24 @@ public class DemoMvpActivity extends BaseActivity<DemoActivityView, DemoActivity | ||
| 403 | intent.putExtra("type","1"); | 401 | intent.putExtra("type","1"); |
| 404 | startActivity(intent); } | 402 | startActivity(intent); } |
| 405 | }); | 403 | }); |
| 404 | + //获取uid | ||
| 405 | + binding.btnUid.setOnClickListener(new View.OnClickListener() { | ||
| 406 | + @Override | ||
| 407 | + public void onClick(View v) { | ||
| 408 | + CNLiveUserService userService= OpenServiceHelpUtil.getUserService(me); | ||
| 409 | + if (null!=userService){ | ||
| 410 | + QMUITipDialogUtil.textDialog(me,userService.getUid(me)); | ||
| 411 | + } | ||
| 412 | + } | ||
| 413 | + }); | ||
| 414 | + //上海电商 | ||
| 415 | + binding.btnShanghai.setOnClickListener(new View.OnClickListener() { | ||
| 416 | + @Override | ||
| 417 | + public void onClick(View v) { | ||
| 418 | +// Intent intent = new Intent(me, cn.cnlive.b2c.MainActivity.class); | ||
| 419 | +// startActivity(intent); | ||
| 420 | + } | ||
| 421 | + }); | ||
| 406 | 422 | ||
| 407 | } | 423 | } |
| 408 | 424 |
app/strike/src/main/res/layout/activity_demo_mvp_main.xml
| @@ -91,6 +91,18 @@ | @@ -91,6 +91,18 @@ | ||
| 91 | android:layout_height="wrap_content" | 91 | android:layout_height="wrap_content" |
| 92 | android:layout_margin="5dp" | 92 | android:layout_margin="5dp" |
| 93 | android:text="动画特效" /> | 93 | android:text="动画特效" /> |
| 94 | + <Button | ||
| 95 | + android:id="@+id/btn_shanghai" | ||
| 96 | + android:layout_width="match_parent" | ||
| 97 | + android:layout_height="wrap_content" | ||
| 98 | + android:layout_margin="5dp" | ||
| 99 | + android:text="上海电商" /> | ||
| 100 | + <Button | ||
| 101 | + android:id="@+id/btn_uid" | ||
| 102 | + android:layout_width="match_parent" | ||
| 103 | + android:layout_height="wrap_content" | ||
| 104 | + android:layout_margin="5dp" | ||
| 105 | + android:text="ARouter获取uid" /> | ||
| 94 | 106 | ||
| 95 | <Button | 107 | <Button |
| 96 | android:id="@+id/btn_cnPlayer" | 108 | android:id="@+id/btn_cnPlayer" |
| @@ -98,12 +110,14 @@ | @@ -98,12 +110,14 @@ | ||
| 98 | android:layout_height="wrap_content" | 110 | android:layout_height="wrap_content" |
| 99 | android:layout_margin="5dp" | 111 | android:layout_margin="5dp" |
| 100 | android:text="点播" /> | 112 | android:text="点播" /> |
| 113 | + | ||
| 101 | <Button | 114 | <Button |
| 102 | android:id="@+id/btn_livePlayer" | 115 | android:id="@+id/btn_livePlayer" |
| 103 | android:layout_width="match_parent" | 116 | android:layout_width="match_parent" |
| 104 | android:layout_height="wrap_content" | 117 | android:layout_height="wrap_content" |
| 105 | android:layout_margin="5dp" | 118 | android:layout_margin="5dp" |
| 106 | android:text="直播" /> | 119 | android:text="直播" /> |
| 120 | + | ||
| 107 | <Button | 121 | <Button |
| 108 | android:id="@+id/btn_pay" | 122 | android:id="@+id/btn_pay" |
| 109 | android:layout_width="match_parent" | 123 | android:layout_width="match_parent" |
app/strike/src/main/res/layout/activity_img.xml
| 1 | <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" | 1 | <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" |
| 2 | + xmlns:lb="http://schemas.android.com/apk/res-auto" | ||
| 2 | android:layout_width="match_parent" | 3 | android:layout_width="match_parent" |
| 3 | - android:layout_height="match_parent" | ||
| 4 | - xmlns:lb="http://schemas.android.com/apk/res-auto"> | 4 | + android:layout_height="match_parent"> |
| 5 | 5 | ||
| 6 | <LinearLayout | 6 | <LinearLayout |
| 7 | android:layout_width="match_parent" | 7 | android:layout_width="match_parent" |
| @@ -11,40 +11,41 @@ | @@ -11,40 +11,41 @@ | ||
| 11 | <TextView | 11 | <TextView |
| 12 | android:layout_width="wrap_content" | 12 | android:layout_width="wrap_content" |
| 13 | android:layout_height="wrap_content" | 13 | android:layout_height="wrap_content" |
| 14 | - android:text="加载动效自定义:" | ||
| 15 | - /> | 14 | + android:text="加载动效自定义:" /> |
| 15 | + | ||
| 16 | <ImageView | 16 | <ImageView |
| 17 | android:id="@+id/iv_test1" | 17 | android:id="@+id/iv_test1" |
| 18 | android:layout_width="300dp" | 18 | android:layout_width="300dp" |
| 19 | android:layout_height="300dp" | 19 | android:layout_height="300dp" |
| 20 | android:padding="10dp" /> | 20 | android:padding="10dp" /> |
| 21 | + | ||
| 21 | <TextView | 22 | <TextView |
| 22 | android:layout_width="wrap_content" | 23 | android:layout_width="wrap_content" |
| 23 | android:layout_height="wrap_content" | 24 | android:layout_height="wrap_content" |
| 24 | - android:text="放大缩小:" | ||
| 25 | - /> | ||
| 26 | - <ImageView | ||
| 27 | - android:id="@+id/iv_test2" | ||
| 28 | - android:layout_width="200dp" | ||
| 29 | - android:layout_height="200dp" | ||
| 30 | - android:padding="10dp" /> | 25 | + android:text="放大缩小:" /> |
| 26 | + | ||
| 27 | + <ImageView | ||
| 28 | + android:id="@+id/iv_test2" | ||
| 29 | + android:layout_width="200dp" | ||
| 30 | + android:layout_height="200dp" | ||
| 31 | + android:padding="10dp" /> | ||
| 31 | 32 | ||
| 32 | <TextView | 33 | <TextView |
| 33 | android:layout_width="wrap_content" | 34 | android:layout_width="wrap_content" |
| 34 | android:layout_height="wrap_content" | 35 | android:layout_height="wrap_content" |
| 35 | - android:text="网络gif:" | ||
| 36 | - /> | 36 | + android:text="网络gif:" /> |
| 37 | 37 | ||
| 38 | <ImageView | 38 | <ImageView |
| 39 | android:id="@+id/iv_test3" | 39 | android:id="@+id/iv_test3" |
| 40 | android:layout_width="300dp" | 40 | android:layout_width="300dp" |
| 41 | android:layout_height="300dp" | 41 | android:layout_height="300dp" |
| 42 | android:padding="10dp" /> | 42 | android:padding="10dp" /> |
| 43 | + | ||
| 43 | <TextView | 44 | <TextView |
| 44 | android:layout_width="wrap_content" | 45 | android:layout_width="wrap_content" |
| 45 | android:layout_height="wrap_content" | 46 | android:layout_height="wrap_content" |
| 46 | - android:text="mipmap下的gif:" | ||
| 47 | - /> | 47 | + android:text="mipmap下的gif:" /> |
| 48 | + | ||
| 48 | <ImageView | 49 | <ImageView |
| 49 | android:id="@+id/iv_test4" | 50 | android:id="@+id/iv_test4" |
| 50 | android:layout_width="300dp" | 51 | android:layout_width="300dp" |
| @@ -54,8 +55,8 @@ | @@ -54,8 +55,8 @@ | ||
| 54 | <TextView | 55 | <TextView |
| 55 | android:layout_width="wrap_content" | 56 | android:layout_width="wrap_content" |
| 56 | android:layout_height="wrap_content" | 57 | android:layout_height="wrap_content" |
| 57 | - android:text="mipmap下的图片:" | ||
| 58 | - /> | 58 | + android:text="mipmap下的图片:" /> |
| 59 | + | ||
| 59 | <ImageView | 60 | <ImageView |
| 60 | android:id="@+id/iv_test5" | 61 | android:id="@+id/iv_test5" |
| 61 | android:layout_width="300dp" | 62 | android:layout_width="300dp" |
| @@ -65,8 +66,8 @@ | @@ -65,8 +66,8 @@ | ||
| 65 | <TextView | 66 | <TextView |
| 66 | android:layout_width="wrap_content" | 67 | android:layout_width="wrap_content" |
| 67 | android:layout_height="wrap_content" | 68 | android:layout_height="wrap_content" |
| 68 | - android:text="滤镜优先级设置" | ||
| 69 | - /> | 69 | + android:text="滤镜优先级设置" /> |
| 70 | + | ||
| 70 | <ImageView | 71 | <ImageView |
| 71 | android:id="@+id/iv_test6" | 72 | android:id="@+id/iv_test6" |
| 72 | android:layout_width="300dp" | 73 | android:layout_width="300dp" |
| @@ -76,8 +77,8 @@ | @@ -76,8 +77,8 @@ | ||
| 76 | <TextView | 77 | <TextView |
| 77 | android:layout_width="wrap_content" | 78 | android:layout_width="wrap_content" |
| 78 | android:layout_height="wrap_content" | 79 | android:layout_height="wrap_content" |
| 79 | - android:text="素描" | ||
| 80 | - /> | 80 | + android:text="素描" /> |
| 81 | + | ||
| 81 | <ImageView | 82 | <ImageView |
| 82 | android:id="@+id/iv_test7" | 83 | android:id="@+id/iv_test7" |
| 83 | android:layout_width="300dp" | 84 | android:layout_width="300dp" |
| @@ -87,8 +88,7 @@ | @@ -87,8 +88,7 @@ | ||
| 87 | <TextView | 88 | <TextView |
| 88 | android:layout_width="wrap_content" | 89 | android:layout_width="wrap_content" |
| 89 | android:layout_height="wrap_content" | 90 | android:layout_height="wrap_content" |
| 90 | - android:text="加载asserts下面的图片" | ||
| 91 | - /> | 91 | + android:text="加载asserts下面的图片" /> |
| 92 | 92 | ||
| 93 | <ImageView | 93 | <ImageView |
| 94 | android:id="@+id/iv_test8" | 94 | android:id="@+id/iv_test8" |
| @@ -99,8 +99,8 @@ | @@ -99,8 +99,8 @@ | ||
| 99 | <TextView | 99 | <TextView |
| 100 | android:layout_width="wrap_content" | 100 | android:layout_width="wrap_content" |
| 101 | android:layout_height="wrap_content" | 101 | android:layout_height="wrap_content" |
| 102 | - android:text="加载raw下面的图片为圆" | ||
| 103 | - /> | 102 | + android:text="加载raw下面的图片为圆" /> |
| 103 | + | ||
| 104 | <ImageView | 104 | <ImageView |
| 105 | android:id="@+id/iv_test9" | 105 | android:id="@+id/iv_test9" |
| 106 | android:layout_width="300dp" | 106 | android:layout_width="300dp" |
| @@ -110,8 +110,8 @@ | @@ -110,8 +110,8 @@ | ||
| 110 | <TextView | 110 | <TextView |
| 111 | android:layout_width="wrap_content" | 111 | android:layout_width="wrap_content" |
| 112 | android:layout_height="wrap_content" | 112 | android:layout_height="wrap_content" |
| 113 | - android:text="图片设置圆角" | ||
| 114 | - /> | 113 | + android:text="图片设置圆角" /> |
| 114 | + | ||
| 115 | <ImageView | 115 | <ImageView |
| 116 | android:id="@+id/iv_test10" | 116 | android:id="@+id/iv_test10" |
| 117 | android:layout_width="300dp" | 117 | android:layout_width="300dp" |
| @@ -121,13 +121,13 @@ | @@ -121,13 +121,13 @@ | ||
| 121 | <TextView | 121 | <TextView |
| 122 | android:layout_width="wrap_content" | 122 | android:layout_width="wrap_content" |
| 123 | android:layout_height="wrap_content" | 123 | android:layout_height="wrap_content" |
| 124 | - android:text="图片下载显示" | ||
| 125 | - /> | 124 | + android:text="图片下载显示" /> |
| 125 | + | ||
| 126 | <Button | 126 | <Button |
| 127 | android:id="@+id/down" | 127 | android:id="@+id/down" |
| 128 | android:layout_width="wrap_content" | 128 | android:layout_width="wrap_content" |
| 129 | android:layout_height="wrap_content" | 129 | android:layout_height="wrap_content" |
| 130 | - android:text="下载"/> | 130 | + android:text="下载" /> |
| 131 | 131 | ||
| 132 | <ImageView | 132 | <ImageView |
| 133 | android:id="@+id/iv_test11" | 133 | android:id="@+id/iv_test11" |
| @@ -138,45 +138,42 @@ | @@ -138,45 +138,42 @@ | ||
| 138 | <TextView | 138 | <TextView |
| 139 | android:layout_width="wrap_content" | 139 | android:layout_width="wrap_content" |
| 140 | android:layout_height="wrap_content" | 140 | android:layout_height="wrap_content" |
| 141 | - android:text="直接代码设置,五边形"/> | 141 | + android:text="直接代码设置,五边形" /> |
| 142 | 142 | ||
| 143 | <com.cnlive.core.imageload.util.MultiView | 143 | <com.cnlive.core.imageload.util.MultiView |
| 144 | android:layout_width="300dp" | 144 | android:layout_width="300dp" |
| 145 | android:layout_height="300dp" | 145 | android:layout_height="300dp" |
| 146 | android:layout_margin="30dp" | 146 | android:layout_margin="30dp" |
| 147 | - lb:angleCount="5" | ||
| 148 | - lb:type="multi" | ||
| 149 | android:src="@mipmap/timgs" | 147 | android:src="@mipmap/timgs" |
| 150 | - /> | 148 | + lb:angleCount="5" |
| 149 | + lb:shapeType="polygon" /> | ||
| 151 | 150 | ||
| 152 | <TextView | 151 | <TextView |
| 153 | android:layout_width="wrap_content" | 152 | android:layout_width="wrap_content" |
| 154 | android:layout_height="wrap_content" | 153 | android:layout_height="wrap_content" |
| 155 | - android:text="直接代码设置,设置圆角"/> | 154 | + android:text="直接代码设置,设置圆角" /> |
| 156 | 155 | ||
| 157 | <com.cnlive.core.imageload.util.MultiView | 156 | <com.cnlive.core.imageload.util.MultiView |
| 158 | android:layout_width="200dp" | 157 | android:layout_width="200dp" |
| 159 | android:layout_height="200dp" | 158 | android:layout_height="200dp" |
| 160 | - android:layout_margin="30dp" | ||
| 161 | android:layout_gravity="center" | 159 | android:layout_gravity="center" |
| 162 | - lb:borderRadius="10dp" | ||
| 163 | - lb:type="round" | 160 | + android:layout_margin="30dp" |
| 164 | android:src="@mipmap/timgs" | 161 | android:src="@mipmap/timgs" |
| 165 | - /> | 162 | + lb:borderRadius="10dp" |
| 163 | + lb:shapeType="round" /> | ||
| 166 | 164 | ||
| 167 | <TextView | 165 | <TextView |
| 168 | android:layout_width="wrap_content" | 166 | android:layout_width="wrap_content" |
| 169 | android:layout_height="wrap_content" | 167 | android:layout_height="wrap_content" |
| 170 | - android:text="直接代码设置圆"/> | 168 | + android:text="直接代码设置圆" /> |
| 171 | 169 | ||
| 172 | <com.cnlive.core.imageload.util.MultiView | 170 | <com.cnlive.core.imageload.util.MultiView |
| 173 | - android:layout_margin="30dp" | ||
| 174 | android:layout_width="200dp" | 171 | android:layout_width="200dp" |
| 175 | android:layout_height="200dp" | 172 | android:layout_height="200dp" |
| 176 | android:layout_gravity="center" | 173 | android:layout_gravity="center" |
| 174 | + android:layout_margin="30dp" | ||
| 177 | android:src="@mipmap/timgs" | 175 | android:src="@mipmap/timgs" |
| 178 | - lb:type="circle" | ||
| 179 | - /> | 176 | + lb:type="circle" /> |
| 180 | 177 | ||
| 181 | </LinearLayout> | 178 | </LinearLayout> |
| 182 | </ScrollView> | 179 | </ScrollView> |
app/strike/src/main/res/xml/app_files.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="utf-8"?> | ||
| 2 | +<resources> | ||
| 3 | + <paths> | ||
| 4 | + <external-path | ||
| 5 | + name="external_files" | ||
| 6 | + path="" /> | ||
| 7 | + | ||
| 8 | + <path> | ||
| 9 | + <root-path | ||
| 10 | + name="root_path" | ||
| 11 | + path="." /> | ||
| 12 | + </path> | ||
| 13 | + | ||
| 14 | + </paths> | ||
| 15 | +</resources> | ||
| 0 | \ No newline at end of file | 16 | \ No newline at end of file |
build.gradle
| @@ -27,6 +27,12 @@ allprojects { | @@ -27,6 +27,12 @@ allprojects { | ||
| 27 | // configurations.all { | 27 | // configurations.all { |
| 28 | ////// resolutionStrategy.force 'androidx.appcompat:appcompat:1.1.0' | 28 | ////// resolutionStrategy.force 'androidx.appcompat:appcompat:1.1.0' |
| 29 | // } | 29 | // } |
| 30 | + //添加java编译指令,防止引用时,形参变成var1 | ||
| 31 | + gradle.projectsEvaluated { | ||
| 32 | + tasks.withType(JavaCompile) { | ||
| 33 | + options.compilerArgs.add('-parameters') | ||
| 34 | + } | ||
| 35 | + } | ||
| 30 | afterEvaluate { | 36 | afterEvaluate { |
| 31 | if (project.parent == null || project.parent == rootProject) return | 37 | if (project.parent == null || project.parent == rootProject) return |
| 32 | 38 | ||
| @@ -129,6 +135,10 @@ allprojects { | @@ -129,6 +135,10 @@ allprojects { | ||
| 129 | url maven.mixedUrl | 135 | url maven.mixedUrl |
| 130 | credentials { username = nexusId; password = nexusPw } | 136 | credentials { username = nexusId; password = nexusPw } |
| 131 | } | 137 | } |
| 138 | + maven { | ||
| 139 | + url 'http://android.nexus.cnlive.com/repository/cnlive-shop/' | ||
| 140 | + credentials { username = 'shop'; password = 'ShangHa1' } | ||
| 141 | + } | ||
| 132 | //------------------ 资源库配置 END------------------ | 142 | //------------------ 资源库配置 END------------------ |
| 133 | maven { url 'https://dl.bintray.com/umsdk/release' } | 143 | maven { url 'https://dl.bintray.com/umsdk/release' } |
| 134 | //关联微博 | 144 | //关联微博 |
| @@ -139,6 +149,7 @@ allprojects { | @@ -139,6 +149,7 @@ allprojects { | ||
| 139 | maven { | 149 | maven { |
| 140 | url 'https://dl.bintray.com/granzon/cnliveLibs' | 150 | url 'https://dl.bintray.com/granzon/cnliveLibs' |
| 141 | } | 151 | } |
| 152 | + | ||
| 142 | maven { | 153 | maven { |
| 143 | url "https://jitpack.io" | 154 | url "https://jitpack.io" |
| 144 | } | 155 | } |
cloud/user/src/main/java/com/cnlive/cloud/user/router/user/CNLiveUserServiceImpl.java
| @@ -6,6 +6,7 @@ import android.text.TextUtils; | @@ -6,6 +6,7 @@ import android.text.TextUtils; | ||
| 6 | import com.alibaba.android.arouter.facade.annotation.Route; | 6 | import com.alibaba.android.arouter.facade.annotation.Route; |
| 7 | import com.alibaba.android.arouter.launcher.ARouter; | 7 | import com.alibaba.android.arouter.launcher.ARouter; |
| 8 | import com.cnlive.cloud.user.auth.UserService; | 8 | import com.cnlive.cloud.user.auth.UserService; |
| 9 | +import com.cnlive.core.libs.base.arouter.RouterConst; | ||
| 9 | import com.cnlive.core.libs.base.arouter.user.CNLiveUserService; | 10 | import com.cnlive.core.libs.base.arouter.user.CNLiveUserService; |
| 10 | import com.cnlive.core.libs.base.arouter.user.OpenUserInfo; | 11 | import com.cnlive.core.libs.base.arouter.user.OpenUserInfo; |
| 11 | 12 | ||
| @@ -14,7 +15,7 @@ import com.cnlive.core.libs.base.arouter.user.OpenUserInfo; | @@ -14,7 +15,7 @@ import com.cnlive.core.libs.base.arouter.user.OpenUserInfo; | ||
| 14 | * | 15 | * |
| 15 | * @author ys | 16 | * @author ys |
| 16 | */ | 17 | */ |
| 17 | -@Route(path = CNLiveUserService.PATH, name = CNLiveUserService.NAME) | 18 | +@Route(path = RouterConst.OPEN_USER_SERVICE_PATH, name = RouterConst.OPEN_USER_SERVICE_NAME) |
| 18 | public class CNLiveUserServiceImpl implements CNLiveUserService { | 19 | public class CNLiveUserServiceImpl implements CNLiveUserService { |
| 19 | 20 | ||
| 20 | @Override | 21 | @Override |
core/base/src/main/java/com/cnlive/core/libs/base/application/MyAppGlideModule.java
| 1 | package com.cnlive.core.libs.base.application; | 1 | package com.cnlive.core.libs.base.application; |
| 2 | 2 | ||
| 3 | +import android.content.Context; | ||
| 4 | + | ||
| 5 | +import androidx.annotation.NonNull; | ||
| 6 | + | ||
| 7 | +import com.bumptech.glide.GlideBuilder; | ||
| 3 | import com.bumptech.glide.annotation.GlideModule; | 8 | import com.bumptech.glide.annotation.GlideModule; |
| 4 | import com.bumptech.glide.module.AppGlideModule; | 9 | import com.bumptech.glide.module.AppGlideModule; |
| 5 | 10 | ||
| @@ -9,5 +14,8 @@ import com.bumptech.glide.module.AppGlideModule; | @@ -9,5 +14,8 @@ import com.bumptech.glide.module.AppGlideModule; | ||
| 9 | 14 | ||
| 10 | @GlideModule | 15 | @GlideModule |
| 11 | public final class MyAppGlideModule extends AppGlideModule { | 16 | public final class MyAppGlideModule extends AppGlideModule { |
| 12 | - | 17 | + @Override |
| 18 | + public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) { | ||
| 19 | + super.applyOptions(context, builder); | ||
| 20 | + } | ||
| 13 | } | 21 | } |
core/base/src/main/java/com/cnlive/core/libs/base/arouter/RouterConst.java
| 1 | package com.cnlive.core.libs.base.arouter; | 1 | package com.cnlive.core.libs.base.arouter; |
| 2 | 2 | ||
| 3 | public class RouterConst { | 3 | public class RouterConst { |
| 4 | + //获取用户信息 | ||
| 4 | public static final String OPEN_USER_SERVICE_PATH = "/Common/UserInfoService"; | 5 | public static final String OPEN_USER_SERVICE_PATH = "/Common/UserInfoService"; |
| 5 | public static final String OPEN_USER_SERVICE_NAME = "UserInfoService"; | 6 | public static final String OPEN_USER_SERVICE_NAME = "UserInfoService"; |
| 6 | 7 |
core/base/src/main/java/com/cnlive/core/libs/base/arouter/user/CNLiveUserService.java
| @@ -8,9 +8,6 @@ import com.alibaba.android.arouter.facade.template.IProvider; | @@ -8,9 +8,6 @@ import com.alibaba.android.arouter.facade.template.IProvider; | ||
| 8 | * 给上海电商 用户库 | 8 | * 给上海电商 用户库 |
| 9 | */ | 9 | */ |
| 10 | public interface CNLiveUserService extends IProvider { | 10 | public interface CNLiveUserService extends IProvider { |
| 11 | - public static final String PATH = "/openService/CNLiveUserService"; | ||
| 12 | - public static final String NAME = "开放用户信息的服务接口"; | ||
| 13 | - | ||
| 14 | /** | 11 | /** |
| 15 | * 跳转到登录页 | 12 | * 跳转到登录页 |
| 16 | * | 13 | * |
core/base/src/main/java/com/cnlive/core/libs/base/util/OpenServiceHelpUtil.java
0 → 100644
| 1 | +package com.cnlive.core.libs.base.util; | ||
| 2 | + | ||
| 3 | +import android.content.Context; | ||
| 4 | + | ||
| 5 | +import com.alibaba.android.arouter.launcher.ARouter; | ||
| 6 | +import com.cnlive.core.libs.base.arouter.RouterConst; | ||
| 7 | +import com.cnlive.core.libs.base.arouter.user.CNLiveUserService; | ||
| 8 | + | ||
| 9 | +public class OpenServiceHelpUtil { | ||
| 10 | + /** | ||
| 11 | + * 获取用户库 | ||
| 12 | + * | ||
| 13 | + * @param context | ||
| 14 | + * @return | ||
| 15 | + */ | ||
| 16 | + public static CNLiveUserService getUserService(Context context) { | ||
| 17 | + CNLiveUserService cnLiveUserService = null; | ||
| 18 | + cnLiveUserService = (CNLiveUserService) ARouter.getInstance().build(RouterConst.OPEN_USER_SERVICE_PATH).navigation(context); | ||
| 19 | + return cnLiveUserService; | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | +// /** | ||
| 23 | +// * 获取支付库 | ||
| 24 | +// * | ||
| 25 | +// * @param context | ||
| 26 | +// * @return | ||
| 27 | +// */ | ||
| 28 | +// public static CNLivePayService getPayService(Context context) { | ||
| 29 | +// CNLivePayService cnLivePayService = null; | ||
| 30 | +// cnLivePayService = (CNLivePayService) ARouter.getInstance().build(CNLivePayService.PATH).navigation(context); | ||
| 31 | +// return cnLivePayService; | ||
| 32 | +// } | ||
| 33 | +// | ||
| 34 | +// /** | ||
| 35 | +// * 获取分享库 | ||
| 36 | +// * | ||
| 37 | +// * @param context | ||
| 38 | +// * @return | ||
| 39 | +// */ | ||
| 40 | +// public static CNLiveShareService getShareService(Context context) { | ||
| 41 | +// CNLiveShareService cnLiveShareService = null; | ||
| 42 | +// cnLiveShareService = (CNLiveShareService) ARouter.getInstance().build(CNLiveShareService.PATH).navigation(context); | ||
| 43 | +// return cnLiveShareService; | ||
| 44 | +// } | ||
| 45 | +} |
core/imageload/src/main/java/com/cnlive/core/imageload/util/MultiView.java
| 1 | package com.cnlive.core.imageload.util; | 1 | package com.cnlive.core.imageload.util; |
| 2 | 2 | ||
| 3 | -import android.annotation.SuppressLint; | ||
| 4 | import android.content.Context; | 3 | import android.content.Context; |
| 5 | import android.content.res.TypedArray; | 4 | import android.content.res.TypedArray; |
| 6 | import android.graphics.Bitmap; | 5 | import android.graphics.Bitmap; |
| @@ -158,7 +157,7 @@ public class MultiView extends ImageView { | @@ -158,7 +157,7 @@ public class MultiView extends ImageView { | ||
| 158 | .applyDimension(TypedValue.COMPLEX_UNIT_DIP, | 157 | .applyDimension(TypedValue.COMPLEX_UNIT_DIP, |
| 159 | BODER_RADIUS_DEFAULT, getResources() | 158 | BODER_RADIUS_DEFAULT, getResources() |
| 160 | .getDisplayMetrics()));// 默认为10dp | 159 | .getDisplayMetrics()));// 默认为10dp |
| 161 | - type = typedArray.getInt(R.styleable.RoundImageView_type, TYPE_CIRCLE);// 默认为Circle | 160 | + type = typedArray.getInt(R.styleable.RoundImageView_shapeType, TYPE_CIRCLE);// 默认为Circle |
| 162 | angleCount = typedArray.getInt(R.styleable.RoundImageView_angleCount, ANGLECOUNT); | 161 | angleCount = typedArray.getInt(R.styleable.RoundImageView_angleCount, ANGLECOUNT); |
| 163 | currentAngle = typedArray.getInt(R.styleable.RoundImageView_currentAngle, currentAngle); | 162 | currentAngle = typedArray.getInt(R.styleable.RoundImageView_currentAngle, currentAngle); |
| 164 | 163 |
core/imageload/src/main/res/values/style.xml
| @@ -2,10 +2,10 @@ | @@ -2,10 +2,10 @@ | ||
| 2 | <resources> | 2 | <resources> |
| 3 | <declare-styleable name="RoundImageView"> | 3 | <declare-styleable name="RoundImageView"> |
| 4 | <attr name="borderRadius" format="dimension" /> | 4 | <attr name="borderRadius" format="dimension" /> |
| 5 | - <attr name="type"> | 5 | + <attr name="shapeType"> |
| 6 | <enum name="circle" value="0" /> | 6 | <enum name="circle" value="0" /> |
| 7 | <enum name="round" value="1" /> | 7 | <enum name="round" value="1" /> |
| 8 | - <enum name="multi" value="3" /> | 8 | + <enum name="polygon" value="3" /> |
| 9 | </attr> | 9 | </attr> |
| 10 | <attr name="angleCount" format="integer" /> | 10 | <attr name="angleCount" format="integer" /> |
| 11 | <attr name="currentAngle" format="integer" /> | 11 | <attr name="currentAngle" format="integer" /> |
module/shanghaishop/build.gradle
| @@ -18,6 +18,13 @@ dependencies { | @@ -18,6 +18,13 @@ dependencies { | ||
| 18 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' | 18 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' |
| 19 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' | 19 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' |
| 20 | 20 | ||
| 21 | + api('cn.cnlive.b2c:cnliveb2c:1.0.0-20191212.082956-16') { | ||
| 22 | + exclude group: 'com.bumptech.glide' | ||
| 23 | + } | ||
| 24 | + api 'cn.cnlive.b2c:nicevideoplayer:1.0.0-20191206.090854-2' | ||
| 25 | + api 'cn.cnlive.b2c:udesk-sdk-ui:1.0.0' | ||
| 26 | + | ||
| 27 | + | ||
| 21 | /** 圆形图片处理 androidx **/ | 28 | /** 圆形图片处理 androidx **/ |
| 22 | implementation 'de.hdodenhof:circleimageview:3.0.1' | 29 | implementation 'de.hdodenhof:circleimageview:3.0.1' |
| 23 | 30 | ||
| @@ -49,7 +56,7 @@ dependencies { | @@ -49,7 +56,7 @@ dependencies { | ||
| 49 | implementation 'com.songhang:smart-headerfooter-recyclerview:1.0.1' | 56 | implementation 'com.songhang:smart-headerfooter-recyclerview:1.0.1' |
| 50 | 57 | ||
| 51 | /*二维码*/ | 58 | /*二维码*/ |
| 52 | - implementation 'com.google.zxing:core:3.3.0' | 59 | +// implementation 'com.google.zxing:core:3.3.0' |
| 53 | 60 | ||
| 54 | // implementation ('cn.yipianfengye.android:zxing-library:2.2'){ | 61 | // implementation ('cn.yipianfengye.android:zxing-library:2.2'){ |
| 55 | // // 如果已经引入 support:appcompat-v7 可以加上这句话 | 62 | // // 如果已经引入 support:appcompat-v7 可以加上这句话 |
| @@ -69,12 +76,12 @@ dependencies { | @@ -69,12 +76,12 @@ dependencies { | ||
| 69 | /*一个Android TabLayout库*/ | 76 | /*一个Android TabLayout库*/ |
| 70 | implementation 'com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar' | 77 | implementation 'com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar' |
| 71 | 78 | ||
| 72 | - /*应用卡顿检测*/ | ||
| 73 | - debugImplementation 'com.github.markzhai:blockcanary-android:1.5.0' | ||
| 74 | - releaseImplementation 'com.github.markzhai:blockcanary-no-op:1.5.0' | 79 | +// /*应用卡顿检测*/ |
| 80 | +// debugImplementation 'com.github.markzhai:blockcanary-android:1.5.0' | ||
| 81 | +// releaseImplementation 'com.github.markzhai:blockcanary-no-op:1.5.0' | ||
| 75 | 82 | ||
| 76 | - /*友盟统计*/ | ||
| 77 | - implementation 'com.umeng.analytics:analytics:latest.integration' | 83 | +// /*友盟统计*/ |
| 84 | +// implementation 'com.umeng.analytics:analytics:latest.integration' | ||
| 78 | 85 | ||
| 79 | /*Float Labeled EditText*/ | 86 | /*Float Labeled EditText*/ |
| 80 | implementation 'com.wrapp.floatlabelededittext:library:0.0.6' | 87 | implementation 'com.wrapp.floatlabelededittext:library:0.0.6' |
| @@ -88,29 +95,5 @@ dependencies { | @@ -88,29 +95,5 @@ dependencies { | ||
| 88 | /*自定义各种形状的imageview */ | 95 | /*自定义各种形状的imageview */ |
| 89 | implementation 'com.github.siyamed:android-shape-imageview:0.9.+@aar' | 96 | implementation 'com.github.siyamed:android-shape-imageview:0.9.+@aar' |
| 90 | 97 | ||
| 91 | - // compile 'com.android.support:appcompat-v7:23.4.0' | ||
| 92 | - | ||
| 93 | - // compile 'com.android.support:recyclerview-v7:23.4.0' | ||
| 94 | - | ||
| 95 | - // compile 'com.android.support:design:23.4.0' | ||
| 96 | - implementation files('libs/alipaySingle-20161222.jar') | ||
| 97 | -// implementation files('libs/BaiduLBS_Android.jar') | ||
| 98 | - implementation files('libs/bankabccaller.jar') | ||
| 99 | - implementation files('libs/EhkingSDK-v2.0.jar') | ||
| 100 | - implementation files('libs/jackson-all-1.9.11.jar') | ||
| 101 | - implementation files('libs/MagicWindowSDK.jar') | ||
| 102 | - implementation files('libs/mqqopenpay.jar') | ||
| 103 | - implementation files('libs/SecurityEnvSDK-release-1.1.0.jar') | ||
| 104 | - implementation files('libs/umeng-common-1.5.3.jar') | ||
| 105 | - implementation files('libs/umeng-share-core-6.9.2.jar') | ||
| 106 | -// implementation files('libs/umeng-share-QQ-simplify-6.9.2.jar') | ||
| 107 | -// implementation files('libs/umeng-share-sina-simplify-6.9.2.jar') | ||
| 108 | -// implementation files('libs/umeng-share-wechat-simplify-6.9.2.jar') | ||
| 109 | -// implementation files('libs/umeng-share-sina-simplify-6.9.2.jar') | ||
| 110 | - implementation files('libs/umeng-shareboard-widget-6.9.2.jar') | ||
| 111 | - implementation files('libs/umeng-sharetool-6.9.2.jar') | ||
| 112 | - implementation files('libs/UPPayAssistEx.jar') | ||
| 113 | - implementation files('libs/UPPayPluginExPro.jar') | ||
| 114 | - | ||
| 115 | 98 | ||
| 116 | } | 99 | } |
module/shanghaishop/libs/EhkingSDK-v2.0.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/MagicWindowSDK.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/SecurityEnvSDK-release-1.1.0.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/UPPayAssistEx.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/UPPayPluginExPro.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/alipaySingle-20161222.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/bankabccaller.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/jackson-all-1.9.11.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/mqqopenpay.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/umeng-common-1.5.3.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/umeng-share-core-6.9.2.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/umeng-shareboard-widget-6.9.2.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/libs/umeng-sharetool-6.9.2.jar deleted
100644 → 0
No preview for this file type
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/DisplayUtil.java deleted
100644 → 0
| 1 | -package com.uuzuche.lib_zxing; | ||
| 2 | - | ||
| 3 | -import android.content.Context; | ||
| 4 | - | ||
| 5 | -/** | ||
| 6 | - * Created by aaron on 16/8/3. | ||
| 7 | - */ | ||
| 8 | -public class DisplayUtil | ||
| 9 | -{ | ||
| 10 | - | ||
| 11 | - public static int screenWidthPx; //屏幕宽 px | ||
| 12 | - public static int screenhightPx; //屏幕高 px | ||
| 13 | - public static float density;//屏幕密度 | ||
| 14 | - public static int densityDPI;//屏幕密度 | ||
| 15 | - public static float screenWidthDip;// dp单位 | ||
| 16 | - public static float screenHightDip;// dp单位 | ||
| 17 | - | ||
| 18 | - | ||
| 19 | - | ||
| 20 | - /** | ||
| 21 | - * 根据手机的分辨率从 dp 的单位 转成为 px(像素) | ||
| 22 | - */ | ||
| 23 | - public static int dip2px(Context context, float dpValue) { | ||
| 24 | - final float scale = context.getResources().getDisplayMetrics().density; | ||
| 25 | - return (int) (dpValue * scale + 0.5f); | ||
| 26 | - } | ||
| 27 | - | ||
| 28 | - /** | ||
| 29 | - * 根据手机的分辨率从 px(像素) 的单位 转成为 dp | ||
| 30 | - */ | ||
| 31 | - public static int px2dip(Context context, float pxValue) { | ||
| 32 | - final float scale = context.getResources().getDisplayMetrics().density; | ||
| 33 | - return (int) (pxValue / scale + 0.5f); | ||
| 34 | - } | ||
| 35 | - | ||
| 36 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/ZApplication.java deleted
100644 → 0
| 1 | -package com.uuzuche.lib_zxing; | ||
| 2 | - | ||
| 3 | -import android.app.Application; | ||
| 4 | -import android.util.DisplayMetrics; | ||
| 5 | - | ||
| 6 | -/** | ||
| 7 | - * Created by aaron on 16/8/9. | ||
| 8 | - */ | ||
| 9 | - | ||
| 10 | -public class ZApplication extends Application { | ||
| 11 | - | ||
| 12 | - @Override | ||
| 13 | - public void onCreate() { | ||
| 14 | - super.onCreate(); | ||
| 15 | - /** | ||
| 16 | - * 初始化尺寸工具类 | ||
| 17 | - */ | ||
| 18 | - initDisplayOpinion(); | ||
| 19 | - } | ||
| 20 | - | ||
| 21 | - private void initDisplayOpinion() { | ||
| 22 | - DisplayMetrics dm = getResources().getDisplayMetrics(); | ||
| 23 | - DisplayUtil.density = dm.density; | ||
| 24 | - DisplayUtil.densityDPI = dm.densityDpi; | ||
| 25 | - DisplayUtil.screenWidthPx = dm.widthPixels; | ||
| 26 | - DisplayUtil.screenhightPx = dm.heightPixels; | ||
| 27 | - DisplayUtil.screenWidthDip = DisplayUtil.px2dip(getApplicationContext(), dm.widthPixels); | ||
| 28 | - DisplayUtil.screenHightDip = DisplayUtil.px2dip(getApplicationContext(), dm.heightPixels); | ||
| 29 | - } | ||
| 30 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/activity/CaptureActivity.java deleted
100644 → 0
| 1 | -package com.uuzuche.lib_zxing.activity; | ||
| 2 | - | ||
| 3 | -import android.content.Intent; | ||
| 4 | -import android.graphics.Bitmap; | ||
| 5 | -import android.os.Bundle; | ||
| 6 | -import android.util.Log; | ||
| 7 | - | ||
| 8 | -import androidx.appcompat.app.AppCompatActivity; | ||
| 9 | - | ||
| 10 | -import com.cnlive.cloud.shanghaishop.R; | ||
| 11 | - | ||
| 12 | - | ||
| 13 | -/** | ||
| 14 | - * Initial the camera | ||
| 15 | - * <p> | ||
| 16 | - * 默认的二维码扫描Activity | ||
| 17 | - */ | ||
| 18 | -public class CaptureActivity extends AppCompatActivity { | ||
| 19 | - | ||
| 20 | - | ||
| 21 | - @Override | ||
| 22 | - protected void onCreate(Bundle savedInstanceState) { | ||
| 23 | - | ||
| 24 | - super.onCreate(savedInstanceState); | ||
| 25 | - setContentView(R.layout.camera); | ||
| 26 | - CaptureFragment captureFragment = new CaptureFragment(); | ||
| 27 | - captureFragment.setAnalyzeCallback(analyzeCallback); | ||
| 28 | - getSupportFragmentManager().beginTransaction().replace(R.id.fl_zxing_container, captureFragment).commit(); | ||
| 29 | - captureFragment.setCameraInitCallBack(new CaptureFragment.CameraInitCallBack() { | ||
| 30 | - @Override | ||
| 31 | - public void callBack(Exception e) { | ||
| 32 | - if (e == null) { | ||
| 33 | - | ||
| 34 | - } else { | ||
| 35 | - Log.e("TAG", "callBack: ", e); | ||
| 36 | - } | ||
| 37 | - } | ||
| 38 | - }); | ||
| 39 | - | ||
| 40 | - } | ||
| 41 | - | ||
| 42 | - /** | ||
| 43 | - * 二维码解析回调函数 | ||
| 44 | - */ | ||
| 45 | - CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() { | ||
| 46 | - @Override | ||
| 47 | - public void onAnalyzeSuccess(Bitmap mBitmap, String result) { | ||
| 48 | - Intent resultIntent = new Intent(); | ||
| 49 | - Bundle bundle = new Bundle(); | ||
| 50 | - bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS); | ||
| 51 | - bundle.putString(CodeUtils.RESULT_STRING, result); | ||
| 52 | - resultIntent.putExtras(bundle); | ||
| 53 | - CaptureActivity.this.setResult(RESULT_OK, resultIntent); | ||
| 54 | - CaptureActivity.this.finish(); | ||
| 55 | - } | ||
| 56 | - | ||
| 57 | - @Override | ||
| 58 | - public void onAnalyzeFailed() { | ||
| 59 | - Intent resultIntent = new Intent(); | ||
| 60 | - Bundle bundle = new Bundle(); | ||
| 61 | - bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED); | ||
| 62 | - bundle.putString(CodeUtils.RESULT_STRING, ""); | ||
| 63 | - resultIntent.putExtras(bundle); | ||
| 64 | - CaptureActivity.this.setResult(RESULT_OK, resultIntent); | ||
| 65 | - CaptureActivity.this.finish(); | ||
| 66 | - } | ||
| 67 | - }; | ||
| 68 | -} | ||
| 69 | \ No newline at end of file | 0 | \ No newline at end of file |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/activity/CaptureFragment.java deleted
100644 → 0
| 1 | -package com.uuzuche.lib_zxing.activity; | ||
| 2 | - | ||
| 3 | -import android.content.res.AssetFileDescriptor; | ||
| 4 | -import android.graphics.Bitmap; | ||
| 5 | -import android.hardware.Camera; | ||
| 6 | -import android.media.AudioManager; | ||
| 7 | -import android.media.MediaPlayer; | ||
| 8 | -import android.os.Bundle; | ||
| 9 | -import android.os.Handler; | ||
| 10 | -import android.os.Vibrator; | ||
| 11 | -import android.text.TextUtils; | ||
| 12 | -import android.view.LayoutInflater; | ||
| 13 | -import android.view.SurfaceHolder; | ||
| 14 | -import android.view.SurfaceView; | ||
| 15 | -import android.view.View; | ||
| 16 | -import android.view.ViewGroup; | ||
| 17 | - | ||
| 18 | -import androidx.annotation.Nullable; | ||
| 19 | -import androidx.fragment.app.Fragment; | ||
| 20 | - | ||
| 21 | -import com.cnlive.cloud.shanghaishop.R; | ||
| 22 | -import com.google.zxing.BarcodeFormat; | ||
| 23 | -import com.google.zxing.Result; | ||
| 24 | -import com.uuzuche.lib_zxing.camera.CameraManager; | ||
| 25 | -import com.uuzuche.lib_zxing.decoding.CaptureActivityHandler; | ||
| 26 | -import com.uuzuche.lib_zxing.decoding.InactivityTimer; | ||
| 27 | -import com.uuzuche.lib_zxing.view.ViewfinderView; | ||
| 28 | - | ||
| 29 | -import java.io.IOException; | ||
| 30 | -import java.util.Vector; | ||
| 31 | - | ||
| 32 | -/** | ||
| 33 | - * 自定义实现的扫描Fragment | ||
| 34 | - */ | ||
| 35 | -public class CaptureFragment extends Fragment implements SurfaceHolder.Callback { | ||
| 36 | - | ||
| 37 | - private CaptureActivityHandler handler; | ||
| 38 | - private ViewfinderView viewfinderView; | ||
| 39 | - private boolean hasSurface; | ||
| 40 | - private Vector<BarcodeFormat> decodeFormats; | ||
| 41 | - private String characterSet; | ||
| 42 | - private InactivityTimer inactivityTimer; | ||
| 43 | - private MediaPlayer mediaPlayer; | ||
| 44 | - private boolean playBeep; | ||
| 45 | - private static final float BEEP_VOLUME = 0.10f; | ||
| 46 | - private boolean vibrate; | ||
| 47 | - private SurfaceView surfaceView; | ||
| 48 | - private SurfaceHolder surfaceHolder; | ||
| 49 | - private CodeUtils.AnalyzeCallback analyzeCallback; | ||
| 50 | - private Camera camera; | ||
| 51 | - | ||
| 52 | - @Override | ||
| 53 | - public void onCreate(@Nullable Bundle savedInstanceState) { | ||
| 54 | - super.onCreate(savedInstanceState); | ||
| 55 | - | ||
| 56 | - | ||
| 57 | - CameraManager.init(getActivity().getApplication()); | ||
| 58 | - | ||
| 59 | - hasSurface = false; | ||
| 60 | - inactivityTimer = new InactivityTimer(this.getActivity()); | ||
| 61 | - } | ||
| 62 | - | ||
| 63 | - @Nullable | ||
| 64 | - @Override | ||
| 65 | - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { | ||
| 66 | - | ||
| 67 | - Bundle bundle = getArguments(); | ||
| 68 | - View view = null; | ||
| 69 | - if (bundle != null) { | ||
| 70 | - int layoutId = bundle.getInt(CodeUtils.LAYOUT_ID); | ||
| 71 | - if (layoutId != -1) { | ||
| 72 | - view = inflater.inflate(layoutId, null); | ||
| 73 | - } | ||
| 74 | - } | ||
| 75 | - | ||
| 76 | - if (view == null) { | ||
| 77 | - view = inflater.inflate(R.layout.fragment_capture, null); | ||
| 78 | - } | ||
| 79 | - | ||
| 80 | - viewfinderView = (ViewfinderView) view.findViewById(R.id.viewfinder_view); | ||
| 81 | - surfaceView = (SurfaceView) view.findViewById(R.id.preview_view); | ||
| 82 | - surfaceHolder = surfaceView.getHolder(); | ||
| 83 | - | ||
| 84 | - return view; | ||
| 85 | - } | ||
| 86 | - | ||
| 87 | - @Override | ||
| 88 | - public void onResume() { | ||
| 89 | - super.onResume(); | ||
| 90 | - if (hasSurface) { | ||
| 91 | - initCamera(surfaceHolder); | ||
| 92 | - } else { | ||
| 93 | - surfaceHolder.addCallback(this); | ||
| 94 | - surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); | ||
| 95 | - } | ||
| 96 | - decodeFormats = null; | ||
| 97 | - characterSet = null; | ||
| 98 | - | ||
| 99 | - playBeep = true; | ||
| 100 | - AudioManager audioService = (AudioManager) getActivity().getSystemService(getActivity().AUDIO_SERVICE); | ||
| 101 | - if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) { | ||
| 102 | - playBeep = false; | ||
| 103 | - } | ||
| 104 | - initBeepSound(); | ||
| 105 | - vibrate = true; | ||
| 106 | - } | ||
| 107 | - | ||
| 108 | - @Override | ||
| 109 | - public void onPause() { | ||
| 110 | - super.onPause(); | ||
| 111 | - if (handler != null) { | ||
| 112 | - handler.quitSynchronously(); | ||
| 113 | - handler = null; | ||
| 114 | - } | ||
| 115 | - CameraManager.get().closeDriver(); | ||
| 116 | - } | ||
| 117 | - | ||
| 118 | - @Override | ||
| 119 | - public void onDestroy() { | ||
| 120 | - super.onDestroy(); | ||
| 121 | - inactivityTimer.shutdown(); | ||
| 122 | - } | ||
| 123 | - | ||
| 124 | - | ||
| 125 | - /** | ||
| 126 | - * Handler scan result | ||
| 127 | - * | ||
| 128 | - * @param result | ||
| 129 | - * @param barcode | ||
| 130 | - */ | ||
| 131 | - public void handleDecode(Result result, Bitmap barcode) { | ||
| 132 | - inactivityTimer.onActivity(); | ||
| 133 | - playBeepSoundAndVibrate(); | ||
| 134 | - | ||
| 135 | - if (result == null || TextUtils.isEmpty(result.getText())) { | ||
| 136 | - if (analyzeCallback != null) { | ||
| 137 | - analyzeCallback.onAnalyzeFailed(); | ||
| 138 | - } | ||
| 139 | - } else { | ||
| 140 | - if (analyzeCallback != null) { | ||
| 141 | - analyzeCallback.onAnalyzeSuccess(barcode, result.getText()); | ||
| 142 | - } | ||
| 143 | - } | ||
| 144 | - } | ||
| 145 | - | ||
| 146 | - private void initCamera(SurfaceHolder surfaceHolder) { | ||
| 147 | - try { | ||
| 148 | - CameraManager.get().openDriver(surfaceHolder); | ||
| 149 | - camera = CameraManager.get().getCamera(); | ||
| 150 | - } catch (Exception e) { | ||
| 151 | - if (callBack != null) { | ||
| 152 | - callBack.callBack(e); | ||
| 153 | - } | ||
| 154 | - return; | ||
| 155 | - } | ||
| 156 | - if (callBack != null) { | ||
| 157 | - callBack.callBack(null); | ||
| 158 | - } | ||
| 159 | - if (handler == null) { | ||
| 160 | - handler = new CaptureActivityHandler(this, decodeFormats, characterSet, viewfinderView); | ||
| 161 | - } | ||
| 162 | - } | ||
| 163 | - | ||
| 164 | - @Override | ||
| 165 | - public void surfaceChanged(SurfaceHolder holder, int format, int width, | ||
| 166 | - int height) { | ||
| 167 | - | ||
| 168 | - } | ||
| 169 | - | ||
| 170 | - @Override | ||
| 171 | - public void surfaceCreated(SurfaceHolder holder) { | ||
| 172 | - if (!hasSurface) { | ||
| 173 | - hasSurface = true; | ||
| 174 | - initCamera(holder); | ||
| 175 | - } | ||
| 176 | - | ||
| 177 | - } | ||
| 178 | - | ||
| 179 | - @Override | ||
| 180 | - public void surfaceDestroyed(SurfaceHolder holder) { | ||
| 181 | - hasSurface = false; | ||
| 182 | - if (camera != null) { | ||
| 183 | - if (camera != null && CameraManager.get().isPreviewing()) { | ||
| 184 | - if (!CameraManager.get().isUseOneShotPreviewCallback()) { | ||
| 185 | - camera.setPreviewCallback(null); | ||
| 186 | - } | ||
| 187 | - camera.stopPreview(); | ||
| 188 | - CameraManager.get().getPreviewCallback().setHandler(null, 0); | ||
| 189 | - CameraManager.get().getAutoFocusCallback().setHandler(null, 0); | ||
| 190 | - CameraManager.get().setPreviewing(false); | ||
| 191 | - } | ||
| 192 | - } | ||
| 193 | - } | ||
| 194 | - | ||
| 195 | - public Handler getHandler() { | ||
| 196 | - return handler; | ||
| 197 | - } | ||
| 198 | - | ||
| 199 | - public void drawViewfinder() { | ||
| 200 | - viewfinderView.drawViewfinder(); | ||
| 201 | - | ||
| 202 | - } | ||
| 203 | - | ||
| 204 | - private void initBeepSound() { | ||
| 205 | - if (playBeep && mediaPlayer == null) { | ||
| 206 | - // The volume on STREAM_SYSTEM is not adjustable, and users found it | ||
| 207 | - // too loud, | ||
| 208 | - // so we now play on the music stream. | ||
| 209 | - getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC); | ||
| 210 | - mediaPlayer = new MediaPlayer(); | ||
| 211 | - mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); | ||
| 212 | - mediaPlayer.setOnCompletionListener(beepListener); | ||
| 213 | - | ||
| 214 | - AssetFileDescriptor file = getResources().openRawResourceFd( | ||
| 215 | - R.raw.beep); | ||
| 216 | - try { | ||
| 217 | - mediaPlayer.setDataSource(file.getFileDescriptor(), | ||
| 218 | - file.getStartOffset(), file.getLength()); | ||
| 219 | - file.close(); | ||
| 220 | - mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME); | ||
| 221 | - mediaPlayer.prepare(); | ||
| 222 | - } catch (IOException e) { | ||
| 223 | - mediaPlayer = null; | ||
| 224 | - } | ||
| 225 | - } | ||
| 226 | - } | ||
| 227 | - | ||
| 228 | - private static final long VIBRATE_DURATION = 200L; | ||
| 229 | - | ||
| 230 | - private void playBeepSoundAndVibrate() { | ||
| 231 | - if (playBeep && mediaPlayer != null) { | ||
| 232 | - mediaPlayer.start(); | ||
| 233 | - } | ||
| 234 | - if (vibrate) { | ||
| 235 | - Vibrator vibrator = (Vibrator) getActivity().getSystemService(getActivity().VIBRATOR_SERVICE); | ||
| 236 | - vibrator.vibrate(VIBRATE_DURATION); | ||
| 237 | - } | ||
| 238 | - } | ||
| 239 | - | ||
| 240 | - /** | ||
| 241 | - * When the beep has finished playing, rewind to queue up another one. | ||
| 242 | - */ | ||
| 243 | - private final MediaPlayer.OnCompletionListener beepListener = new MediaPlayer.OnCompletionListener() { | ||
| 244 | - public void onCompletion(MediaPlayer mediaPlayer) { | ||
| 245 | - mediaPlayer.seekTo(0); | ||
| 246 | - } | ||
| 247 | - }; | ||
| 248 | - | ||
| 249 | - public CodeUtils.AnalyzeCallback getAnalyzeCallback() { | ||
| 250 | - return analyzeCallback; | ||
| 251 | - } | ||
| 252 | - | ||
| 253 | - public void setAnalyzeCallback(CodeUtils.AnalyzeCallback analyzeCallback) { | ||
| 254 | - this.analyzeCallback = analyzeCallback; | ||
| 255 | - } | ||
| 256 | - | ||
| 257 | - @Nullable | ||
| 258 | - CameraInitCallBack callBack; | ||
| 259 | - | ||
| 260 | - /** | ||
| 261 | - * Set callback for Camera check whether Camera init success or not. | ||
| 262 | - */ | ||
| 263 | - public void setCameraInitCallBack(CameraInitCallBack callBack) { | ||
| 264 | - this.callBack = callBack; | ||
| 265 | - } | ||
| 266 | - | ||
| 267 | - interface CameraInitCallBack { | ||
| 268 | - /** | ||
| 269 | - * Callback for Camera init result. | ||
| 270 | - * @param e If is's null,means success.otherwise Camera init failed with the Exception. | ||
| 271 | - */ | ||
| 272 | - void callBack(Exception e); | ||
| 273 | - } | ||
| 274 | - | ||
| 275 | - | ||
| 276 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/activity/CodeUtils.java deleted
100644 → 0
| 1 | -package com.uuzuche.lib_zxing.activity; | ||
| 2 | - | ||
| 3 | -import android.graphics.Bitmap; | ||
| 4 | -import android.graphics.BitmapFactory; | ||
| 5 | -import android.graphics.Matrix; | ||
| 6 | -import android.hardware.Camera; | ||
| 7 | -import android.os.Bundle; | ||
| 8 | -import android.text.TextUtils; | ||
| 9 | - | ||
| 10 | -import com.google.zxing.BarcodeFormat; | ||
| 11 | -import com.google.zxing.BinaryBitmap; | ||
| 12 | -import com.google.zxing.DecodeHintType; | ||
| 13 | -import com.google.zxing.EncodeHintType; | ||
| 14 | -import com.google.zxing.MultiFormatReader; | ||
| 15 | -import com.google.zxing.Result; | ||
| 16 | -import com.google.zxing.WriterException; | ||
| 17 | -import com.google.zxing.common.BitMatrix; | ||
| 18 | -import com.google.zxing.common.HybridBinarizer; | ||
| 19 | -import com.google.zxing.qrcode.QRCodeWriter; | ||
| 20 | -import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; | ||
| 21 | -import com.uuzuche.lib_zxing.camera.BitmapLuminanceSource; | ||
| 22 | -import com.uuzuche.lib_zxing.camera.CameraManager; | ||
| 23 | -import com.uuzuche.lib_zxing.decoding.DecodeFormatManager; | ||
| 24 | - | ||
| 25 | -import java.util.Hashtable; | ||
| 26 | -import java.util.Vector; | ||
| 27 | - | ||
| 28 | -/** | ||
| 29 | - * Created by aaron on 16/7/27. | ||
| 30 | - * 二维码扫描工具类 | ||
| 31 | - */ | ||
| 32 | -public class CodeUtils { | ||
| 33 | - | ||
| 34 | - public static final String RESULT_TYPE = "result_type"; | ||
| 35 | - public static final String RESULT_STRING = "result_string"; | ||
| 36 | - public static final int RESULT_SUCCESS = 1; | ||
| 37 | - public static final int RESULT_FAILED = 2; | ||
| 38 | - | ||
| 39 | - public static final String LAYOUT_ID = "layout_id"; | ||
| 40 | - | ||
| 41 | - | ||
| 42 | - | ||
| 43 | - /** | ||
| 44 | - * 解析二维码图片工具类 | ||
| 45 | - * @param analyzeCallback | ||
| 46 | - */ | ||
| 47 | - public static void analyzeBitmap(String path, AnalyzeCallback analyzeCallback) { | ||
| 48 | - | ||
| 49 | - /** | ||
| 50 | - * 首先判断图片的大小,若图片过大,则执行图片的裁剪操作,防止OOM | ||
| 51 | - */ | ||
| 52 | - BitmapFactory.Options options = new BitmapFactory.Options(); | ||
| 53 | - options.inJustDecodeBounds = true; // 先获取原大小 | ||
| 54 | - Bitmap mBitmap = BitmapFactory.decodeFile(path, options); | ||
| 55 | - options.inJustDecodeBounds = false; // 获取新的大小 | ||
| 56 | - | ||
| 57 | - int sampleSize = (int) (options.outHeight / (float) 400); | ||
| 58 | - | ||
| 59 | - if (sampleSize <= 0) | ||
| 60 | - sampleSize = 1; | ||
| 61 | - options.inSampleSize = sampleSize; | ||
| 62 | - mBitmap = BitmapFactory.decodeFile(path, options); | ||
| 63 | - | ||
| 64 | - MultiFormatReader multiFormatReader = new MultiFormatReader(); | ||
| 65 | - | ||
| 66 | - // 解码的参数 | ||
| 67 | - Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(2); | ||
| 68 | - // 可以解析的编码类型 | ||
| 69 | - Vector<BarcodeFormat> decodeFormats = new Vector<BarcodeFormat>(); | ||
| 70 | - if (decodeFormats == null || decodeFormats.isEmpty()) { | ||
| 71 | - decodeFormats = new Vector<BarcodeFormat>(); | ||
| 72 | - | ||
| 73 | - // 这里设置可扫描的类型,我这里选择了都支持 | ||
| 74 | - decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS); | ||
| 75 | - decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS); | ||
| 76 | - decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS); | ||
| 77 | - } | ||
| 78 | - hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats); | ||
| 79 | - // 设置继续的字符编码格式为UTF8 | ||
| 80 | - // hints.put(DecodeHintType.CHARACTER_SET, "UTF8"); | ||
| 81 | - // 设置解析配置参数 | ||
| 82 | - multiFormatReader.setHints(hints); | ||
| 83 | - | ||
| 84 | - // 开始对图像资源解码 | ||
| 85 | - Result rawResult = null; | ||
| 86 | - try { | ||
| 87 | - rawResult = multiFormatReader.decodeWithState(new BinaryBitmap(new HybridBinarizer(new BitmapLuminanceSource(mBitmap)))); | ||
| 88 | - } catch (Exception e) { | ||
| 89 | - e.printStackTrace(); | ||
| 90 | - } | ||
| 91 | - | ||
| 92 | - if (rawResult != null) { | ||
| 93 | - if (analyzeCallback != null) { | ||
| 94 | - analyzeCallback.onAnalyzeSuccess(mBitmap, rawResult.getText()); | ||
| 95 | - } | ||
| 96 | - } else { | ||
| 97 | - if (analyzeCallback != null) { | ||
| 98 | - analyzeCallback.onAnalyzeFailed(); | ||
| 99 | - } | ||
| 100 | - } | ||
| 101 | - } | ||
| 102 | - | ||
| 103 | - /** | ||
| 104 | - * 生成二维码图片 | ||
| 105 | - * @param text | ||
| 106 | - * @param w | ||
| 107 | - * @param h | ||
| 108 | - * @param logo | ||
| 109 | - * @return | ||
| 110 | - */ | ||
| 111 | - public static Bitmap createImage(String text, int w, int h, Bitmap logo) { | ||
| 112 | - if (TextUtils.isEmpty(text)) { | ||
| 113 | - return null; | ||
| 114 | - } | ||
| 115 | - try { | ||
| 116 | - Bitmap scaleLogo = getScaleLogo(logo,w,h); | ||
| 117 | - | ||
| 118 | - int offsetX = w / 2; | ||
| 119 | - int offsetY = h / 2; | ||
| 120 | - | ||
| 121 | - int scaleWidth = 0; | ||
| 122 | - int scaleHeight = 0; | ||
| 123 | - if (scaleLogo != null) { | ||
| 124 | - scaleWidth = scaleLogo.getWidth(); | ||
| 125 | - scaleHeight = scaleLogo.getHeight(); | ||
| 126 | - offsetX = (w - scaleWidth) / 2; | ||
| 127 | - offsetY = (h - scaleHeight) / 2; | ||
| 128 | - } | ||
| 129 | - Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); | ||
| 130 | - hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); | ||
| 131 | - //容错级别 | ||
| 132 | - hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); | ||
| 133 | - //设置空白边距的宽度 | ||
| 134 | - hints.put(EncodeHintType.MARGIN, 0); | ||
| 135 | - BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, w, h, hints); | ||
| 136 | - int[] pixels = new int[w * h]; | ||
| 137 | - for (int y = 0; y < h; y++) { | ||
| 138 | - for (int x = 0; x < w; x++) { | ||
| 139 | - if(x >= offsetX && x < offsetX + scaleWidth && y>= offsetY && y < offsetY + scaleHeight){ | ||
| 140 | - int pixel = scaleLogo.getPixel(x-offsetX,y-offsetY); | ||
| 141 | - if(pixel == 0){ | ||
| 142 | - if(bitMatrix.get(x, y)){ | ||
| 143 | - pixel = 0xff000000; | ||
| 144 | - }else{ | ||
| 145 | - pixel = 0xffffffff; | ||
| 146 | - } | ||
| 147 | - } | ||
| 148 | - pixels[y * w + x] = pixel; | ||
| 149 | - }else{ | ||
| 150 | - if (bitMatrix.get(x, y)) { | ||
| 151 | - pixels[y * w + x] = 0xff000000; | ||
| 152 | - } else { | ||
| 153 | - pixels[y * w + x] = 0xffffffff; | ||
| 154 | - } | ||
| 155 | - } | ||
| 156 | - } | ||
| 157 | - } | ||
| 158 | - Bitmap bitmap = Bitmap.createBitmap(w, h, | ||
| 159 | - Bitmap.Config.ARGB_8888); | ||
| 160 | - bitmap.setPixels(pixels, 0, w, 0, 0, w, h); | ||
| 161 | - return bitmap; | ||
| 162 | - } catch (WriterException e) { | ||
| 163 | - e.printStackTrace(); | ||
| 164 | - } | ||
| 165 | - return null; | ||
| 166 | - } | ||
| 167 | - | ||
| 168 | - private static Bitmap getScaleLogo(Bitmap logo, int w, int h){ | ||
| 169 | - if(logo == null)return null; | ||
| 170 | - Matrix matrix = new Matrix(); | ||
| 171 | - float scaleFactor = Math.min(w * 1.0f / 5 / logo.getWidth(), h * 1.0f / 5 /logo.getHeight()); | ||
| 172 | - matrix.postScale(scaleFactor,scaleFactor); | ||
| 173 | - Bitmap result = Bitmap.createBitmap(logo, 0, 0, logo.getWidth(), logo.getHeight(), matrix, true); | ||
| 174 | - return result; | ||
| 175 | - } | ||
| 176 | - | ||
| 177 | - /** | ||
| 178 | - * 解析二维码结果 | ||
| 179 | - */ | ||
| 180 | - public interface AnalyzeCallback{ | ||
| 181 | - | ||
| 182 | - public void onAnalyzeSuccess(Bitmap mBitmap, String result); | ||
| 183 | - | ||
| 184 | - public void onAnalyzeFailed(); | ||
| 185 | - } | ||
| 186 | - | ||
| 187 | - | ||
| 188 | - /** | ||
| 189 | - * 为CaptureFragment设置layout参数 | ||
| 190 | - * @param captureFragment | ||
| 191 | - * @param layoutId | ||
| 192 | - */ | ||
| 193 | - public static void setFragmentArgs(CaptureFragment captureFragment, int layoutId) { | ||
| 194 | - if (captureFragment == null || layoutId == -1) { | ||
| 195 | - return; | ||
| 196 | - } | ||
| 197 | - | ||
| 198 | - Bundle bundle = new Bundle(); | ||
| 199 | - bundle.putInt(LAYOUT_ID, layoutId); | ||
| 200 | - captureFragment.setArguments(bundle); | ||
| 201 | - } | ||
| 202 | - | ||
| 203 | - public static void isLightEnable(boolean isEnable) { | ||
| 204 | - if (isEnable) { | ||
| 205 | - Camera camera = CameraManager.get().getCamera(); | ||
| 206 | - if (camera != null) { | ||
| 207 | - Camera.Parameters parameter = camera.getParameters(); | ||
| 208 | - parameter.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); | ||
| 209 | - camera.setParameters(parameter); | ||
| 210 | - } | ||
| 211 | - } else { | ||
| 212 | - Camera camera = CameraManager.get().getCamera(); | ||
| 213 | - if (camera != null) { | ||
| 214 | - Camera.Parameters parameter = camera.getParameters(); | ||
| 215 | - parameter.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); | ||
| 216 | - camera.setParameters(parameter); | ||
| 217 | - } | ||
| 218 | - } | ||
| 219 | - } | ||
| 220 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/activity/ZXingLibrary.java deleted
100644 → 0
| 1 | -package com.uuzuche.lib_zxing.activity; | ||
| 2 | - | ||
| 3 | -import android.content.Context; | ||
| 4 | -import android.util.DisplayMetrics; | ||
| 5 | - | ||
| 6 | -import com.uuzuche.lib_zxing.DisplayUtil; | ||
| 7 | - | ||
| 8 | -/** | ||
| 9 | - * Created by aaron on 16/9/7. | ||
| 10 | - */ | ||
| 11 | - | ||
| 12 | -public class ZXingLibrary { | ||
| 13 | - | ||
| 14 | - public static void initDisplayOpinion(Context context) { | ||
| 15 | - if (context == null) { | ||
| 16 | - return; | ||
| 17 | - } | ||
| 18 | - DisplayMetrics dm = context.getResources().getDisplayMetrics(); | ||
| 19 | - DisplayUtil.density = dm.density; | ||
| 20 | - DisplayUtil.densityDPI = dm.densityDpi; | ||
| 21 | - DisplayUtil.screenWidthPx = dm.widthPixels; | ||
| 22 | - DisplayUtil.screenhightPx = dm.heightPixels; | ||
| 23 | - DisplayUtil.screenWidthDip = DisplayUtil.px2dip(context, dm.widthPixels); | ||
| 24 | - DisplayUtil.screenHightDip = DisplayUtil.px2dip(context, dm.heightPixels); | ||
| 25 | - } | ||
| 26 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/camera/AutoFocusCallback.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2010 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.camera; | ||
| 18 | - | ||
| 19 | -import android.hardware.Camera; | ||
| 20 | -import android.os.Handler; | ||
| 21 | -import android.os.Message; | ||
| 22 | -import android.util.Log; | ||
| 23 | - | ||
| 24 | -public final class AutoFocusCallback implements Camera.AutoFocusCallback { | ||
| 25 | - | ||
| 26 | - private static final String TAG = AutoFocusCallback.class.getSimpleName(); | ||
| 27 | - | ||
| 28 | - private static final long AUTOFOCUS_INTERVAL_MS = 1500L; | ||
| 29 | - | ||
| 30 | - private Handler autoFocusHandler; | ||
| 31 | - private int autoFocusMessage; | ||
| 32 | - | ||
| 33 | - public void setHandler(Handler autoFocusHandler, int autoFocusMessage) { | ||
| 34 | - this.autoFocusHandler = autoFocusHandler; | ||
| 35 | - this.autoFocusMessage = autoFocusMessage; | ||
| 36 | - } | ||
| 37 | - | ||
| 38 | - public void onAutoFocus(boolean success, Camera camera) { | ||
| 39 | - if (autoFocusHandler != null) { | ||
| 40 | - Message message = autoFocusHandler.obtainMessage(autoFocusMessage, success); | ||
| 41 | - autoFocusHandler.sendMessageDelayed(message, AUTOFOCUS_INTERVAL_MS); | ||
| 42 | - autoFocusHandler = null; | ||
| 43 | - } else { | ||
| 44 | - Log.d(TAG, "Got auto-focus callback, but no handler for it"); | ||
| 45 | - } | ||
| 46 | - } | ||
| 47 | - | ||
| 48 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/camera/BitmapLuminanceSource.java deleted
100644 → 0
| 1 | -package com.uuzuche.lib_zxing.camera; | ||
| 2 | - | ||
| 3 | -import android.graphics.Bitmap; | ||
| 4 | - | ||
| 5 | -import com.google.zxing.LuminanceSource; | ||
| 6 | - | ||
| 7 | -/** | ||
| 8 | - * Created by aaron on 16/7/27. | ||
| 9 | - * 自定义解析Bitmap LuminanceSource | ||
| 10 | - */ | ||
| 11 | -public class BitmapLuminanceSource extends LuminanceSource { | ||
| 12 | - | ||
| 13 | - private byte bitmapPixels[]; | ||
| 14 | - | ||
| 15 | - public BitmapLuminanceSource(Bitmap bitmap) { | ||
| 16 | - super(bitmap.getWidth(), bitmap.getHeight()); | ||
| 17 | - | ||
| 18 | - // 首先,要取得该图片的像素数组内容 | ||
| 19 | - int[] data = new int[bitmap.getWidth() * bitmap.getHeight()]; | ||
| 20 | - this.bitmapPixels = new byte[bitmap.getWidth() * bitmap.getHeight()]; | ||
| 21 | - bitmap.getPixels(data, 0, getWidth(), 0, 0, getWidth(), getHeight()); | ||
| 22 | - | ||
| 23 | - // 将int数组转换为byte数组,也就是取像素值中蓝色值部分作为辨析内容 | ||
| 24 | - for (int i = 0; i < data.length; i++) { | ||
| 25 | - this.bitmapPixels[i] = (byte) data[i]; | ||
| 26 | - } | ||
| 27 | - } | ||
| 28 | - | ||
| 29 | - @Override | ||
| 30 | - public byte[] getMatrix() { | ||
| 31 | - // 返回我们生成好的像素数据 | ||
| 32 | - return bitmapPixels; | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - @Override | ||
| 36 | - public byte[] getRow(int y, byte[] row) { | ||
| 37 | - // 这里要得到指定行的像素数据 | ||
| 38 | - System.arraycopy(bitmapPixels, y * getWidth(), row, 0, getWidth()); | ||
| 39 | - return row; | ||
| 40 | - } | ||
| 41 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/camera/CameraConfigurationManager.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2010 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.camera; | ||
| 18 | - | ||
| 19 | -import android.content.Context; | ||
| 20 | -import android.graphics.Point; | ||
| 21 | -import android.hardware.Camera; | ||
| 22 | -import android.os.Build; | ||
| 23 | -import android.util.Log; | ||
| 24 | -import android.view.Display; | ||
| 25 | -import android.view.WindowManager; | ||
| 26 | - | ||
| 27 | -import java.util.regex.Pattern; | ||
| 28 | - | ||
| 29 | -final class CameraConfigurationManager { | ||
| 30 | - | ||
| 31 | - private static final String TAG = CameraConfigurationManager.class.getSimpleName(); | ||
| 32 | - | ||
| 33 | - private static final int TEN_DESIRED_ZOOM = 27; | ||
| 34 | - private static final int DESIRED_SHARPNESS = 30; | ||
| 35 | - | ||
| 36 | - private static final Pattern COMMA_PATTERN = Pattern.compile(","); | ||
| 37 | - | ||
| 38 | - private final Context context; | ||
| 39 | - private Point screenResolution; | ||
| 40 | - private Point cameraResolution; | ||
| 41 | - private int previewFormat; | ||
| 42 | - private String previewFormatString; | ||
| 43 | - | ||
| 44 | - CameraConfigurationManager(Context context) { | ||
| 45 | - this.context = context; | ||
| 46 | - } | ||
| 47 | - | ||
| 48 | - /** | ||
| 49 | - * Reads, one time, values from the camera that are needed by the app. | ||
| 50 | - */ | ||
| 51 | - void initFromCameraParameters(Camera camera) { | ||
| 52 | - Camera.Parameters parameters = camera.getParameters(); | ||
| 53 | - previewFormat = parameters.getPreviewFormat(); | ||
| 54 | - previewFormatString = parameters.get("preview-format"); | ||
| 55 | - Log.d(TAG, "Default preview format: " + previewFormat + '/' + previewFormatString); | ||
| 56 | - WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); | ||
| 57 | - Display display = manager.getDefaultDisplay(); | ||
| 58 | - screenResolution = new Point(display.getWidth(), display.getHeight()); | ||
| 59 | - Log.d(TAG, "Screen resolution: " + screenResolution); | ||
| 60 | - | ||
| 61 | - Point screenResolutionForCamera = new Point(); | ||
| 62 | - screenResolutionForCamera.x = screenResolution.x; | ||
| 63 | - screenResolutionForCamera.y = screenResolution.y; | ||
| 64 | - // preview size is always something like 480*320, other 320*480 | ||
| 65 | - if (screenResolution.x < screenResolution.y) { | ||
| 66 | - screenResolutionForCamera.x = screenResolution.y; | ||
| 67 | - screenResolutionForCamera.y = screenResolution.x; | ||
| 68 | - } | ||
| 69 | - Log.i("#########", "screenX:" + screenResolutionForCamera.x + " screenY:" + screenResolutionForCamera.y); | ||
| 70 | - cameraResolution = getCameraResolution(parameters, screenResolutionForCamera); | ||
| 71 | - | ||
| 72 | - // cameraResolution = getCameraResolution(parameters, screenResolution); | ||
| 73 | - Log.d(TAG, "Camera resolution: " + screenResolution); | ||
| 74 | - } | ||
| 75 | - | ||
| 76 | - /** | ||
| 77 | - * Sets the camera up to take preview images which are used for both preview and decoding. | ||
| 78 | - * We detect the preview format here so that buildLuminanceSource() can build an appropriate | ||
| 79 | - * LuminanceSource subclass. In the future we may want to force YUV420SP as it's the smallest, | ||
| 80 | - * and the planar Y can be used for barcode scanning without a copy in some cases. | ||
| 81 | - */ | ||
| 82 | - void setDesiredCameraParameters(Camera camera) { | ||
| 83 | - Camera.Parameters parameters = camera.getParameters(); | ||
| 84 | - Log.d(TAG, "Setting preview size: " + cameraResolution); | ||
| 85 | - parameters.setPreviewSize(cameraResolution.x, cameraResolution.y); | ||
| 86 | - setFlash(parameters); | ||
| 87 | - setZoom(parameters); | ||
| 88 | - //setSharpness(parameters); | ||
| 89 | - //modify here | ||
| 90 | - camera.setDisplayOrientation(90); | ||
| 91 | - camera.setParameters(parameters); | ||
| 92 | - } | ||
| 93 | - | ||
| 94 | - Point getCameraResolution() { | ||
| 95 | - return cameraResolution; | ||
| 96 | - } | ||
| 97 | - | ||
| 98 | - Point getScreenResolution() { | ||
| 99 | - return screenResolution; | ||
| 100 | - } | ||
| 101 | - | ||
| 102 | - int getPreviewFormat() { | ||
| 103 | - return previewFormat; | ||
| 104 | - } | ||
| 105 | - | ||
| 106 | - String getPreviewFormatString() { | ||
| 107 | - return previewFormatString; | ||
| 108 | - } | ||
| 109 | - | ||
| 110 | - private static Point getCameraResolution(Camera.Parameters parameters, Point screenResolution) { | ||
| 111 | - | ||
| 112 | - String previewSizeValueString = parameters.get("preview-size-values"); | ||
| 113 | - // saw this on Xperia | ||
| 114 | - if (previewSizeValueString == null) { | ||
| 115 | - previewSizeValueString = parameters.get("preview-size-value"); | ||
| 116 | - } | ||
| 117 | - | ||
| 118 | - Point cameraResolution = null; | ||
| 119 | - | ||
| 120 | - if (previewSizeValueString != null) { | ||
| 121 | - Log.d(TAG, "preview-size-values parameter: " + previewSizeValueString); | ||
| 122 | - cameraResolution = findBestPreviewSizeValue(previewSizeValueString, screenResolution); | ||
| 123 | - } | ||
| 124 | - | ||
| 125 | - if (cameraResolution == null) { | ||
| 126 | - // Ensure that the camera resolution is a multiple of 8, as the screen may not be. | ||
| 127 | - cameraResolution = new Point( | ||
| 128 | - (screenResolution.x >> 3) << 3, | ||
| 129 | - (screenResolution.y >> 3) << 3); | ||
| 130 | - } | ||
| 131 | - | ||
| 132 | - return cameraResolution; | ||
| 133 | - } | ||
| 134 | - | ||
| 135 | - private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString, Point screenResolution) { | ||
| 136 | - int bestX = 0; | ||
| 137 | - int bestY = 0; | ||
| 138 | - int diff = Integer.MAX_VALUE; | ||
| 139 | - for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) { | ||
| 140 | - | ||
| 141 | - previewSize = previewSize.trim(); | ||
| 142 | - int dimPosition = previewSize.indexOf('x'); | ||
| 143 | - if (dimPosition < 0) { | ||
| 144 | - Log.w(TAG, "Bad preview-size: " + previewSize); | ||
| 145 | - continue; | ||
| 146 | - } | ||
| 147 | - | ||
| 148 | - int newX; | ||
| 149 | - int newY; | ||
| 150 | - try { | ||
| 151 | - newX = Integer.parseInt(previewSize.substring(0, dimPosition)); | ||
| 152 | - newY = Integer.parseInt(previewSize.substring(dimPosition + 1)); | ||
| 153 | - } catch (NumberFormatException nfe) { | ||
| 154 | - Log.w(TAG, "Bad preview-size: " + previewSize); | ||
| 155 | - continue; | ||
| 156 | - } | ||
| 157 | - | ||
| 158 | - int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y); | ||
| 159 | - if (newDiff == 0) { | ||
| 160 | - bestX = newX; | ||
| 161 | - bestY = newY; | ||
| 162 | - break; | ||
| 163 | - } else if (newDiff < diff) { | ||
| 164 | - bestX = newX; | ||
| 165 | - bestY = newY; | ||
| 166 | - diff = newDiff; | ||
| 167 | - } | ||
| 168 | - | ||
| 169 | - } | ||
| 170 | - | ||
| 171 | - if (bestX > 0 && bestY > 0) { | ||
| 172 | - return new Point(bestX, bestY); | ||
| 173 | - } | ||
| 174 | - return null; | ||
| 175 | - } | ||
| 176 | - | ||
| 177 | - private static int findBestMotZoomValue(CharSequence stringValues, int tenDesiredZoom) { | ||
| 178 | - int tenBestValue = 0; | ||
| 179 | - for (String stringValue : COMMA_PATTERN.split(stringValues)) { | ||
| 180 | - stringValue = stringValue.trim(); | ||
| 181 | - double value; | ||
| 182 | - try { | ||
| 183 | - value = Double.parseDouble(stringValue); | ||
| 184 | - } catch (NumberFormatException nfe) { | ||
| 185 | - return tenDesiredZoom; | ||
| 186 | - } | ||
| 187 | - int tenValue = (int) (10.0 * value); | ||
| 188 | - if (Math.abs(tenDesiredZoom - value) < Math.abs(tenDesiredZoom - tenBestValue)) { | ||
| 189 | - tenBestValue = tenValue; | ||
| 190 | - } | ||
| 191 | - } | ||
| 192 | - return tenBestValue; | ||
| 193 | - } | ||
| 194 | - | ||
| 195 | - private void setFlash(Camera.Parameters parameters) { | ||
| 196 | - // FIXME: This is a hack to turn the flash off on the Samsung Galaxy. | ||
| 197 | - // And this is a hack-hack to work around a different value on the Behold II | ||
| 198 | - // Restrict Behold II check to Cupcake, per Samsung's advice | ||
| 199 | - //if (Build.MODEL.contains("Behold II") && | ||
| 200 | - // CameraManager.SDK_INT == Build.VERSION_CODES.CUPCAKE) { | ||
| 201 | - if (Build.MODEL.contains("Behold II") && CameraManager.SDK_INT == 3) { // 3 = Cupcake | ||
| 202 | - parameters.set("flash-value", 1); | ||
| 203 | - } else { | ||
| 204 | - parameters.set("flash-value", 2); | ||
| 205 | - } | ||
| 206 | - // This is the standard setting to turn the flash off that all devices should honor. | ||
| 207 | - parameters.set("flash-mode", "off"); | ||
| 208 | - } | ||
| 209 | - | ||
| 210 | - private void setZoom(Camera.Parameters parameters) { | ||
| 211 | - | ||
| 212 | - String zoomSupportedString = parameters.get("zoom-supported"); | ||
| 213 | - if (zoomSupportedString != null && !Boolean.parseBoolean(zoomSupportedString)) { | ||
| 214 | - return; | ||
| 215 | - } | ||
| 216 | - | ||
| 217 | - int tenDesiredZoom = TEN_DESIRED_ZOOM; | ||
| 218 | - | ||
| 219 | - String maxZoomString = parameters.get("max-zoom"); | ||
| 220 | - if (maxZoomString != null) { | ||
| 221 | - try { | ||
| 222 | - int tenMaxZoom = (int) (10.0 * Double.parseDouble(maxZoomString)); | ||
| 223 | - if (tenDesiredZoom > tenMaxZoom) { | ||
| 224 | - tenDesiredZoom = tenMaxZoom; | ||
| 225 | - } | ||
| 226 | - } catch (NumberFormatException nfe) { | ||
| 227 | - Log.w(TAG, "Bad max-zoom: " + maxZoomString); | ||
| 228 | - } | ||
| 229 | - } | ||
| 230 | - | ||
| 231 | - String takingPictureZoomMaxString = parameters.get("taking-picture-zoom-max"); | ||
| 232 | - if (takingPictureZoomMaxString != null) { | ||
| 233 | - try { | ||
| 234 | - int tenMaxZoom = Integer.parseInt(takingPictureZoomMaxString); | ||
| 235 | - if (tenDesiredZoom > tenMaxZoom) { | ||
| 236 | - tenDesiredZoom = tenMaxZoom; | ||
| 237 | - } | ||
| 238 | - } catch (NumberFormatException nfe) { | ||
| 239 | - Log.w(TAG, "Bad taking-picture-zoom-max: " + takingPictureZoomMaxString); | ||
| 240 | - } | ||
| 241 | - } | ||
| 242 | - | ||
| 243 | - String motZoomValuesString = parameters.get("mot-zoom-values"); | ||
| 244 | - if (motZoomValuesString != null) { | ||
| 245 | - tenDesiredZoom = findBestMotZoomValue(motZoomValuesString, tenDesiredZoom); | ||
| 246 | - } | ||
| 247 | - | ||
| 248 | - String motZoomStepString = parameters.get("mot-zoom-step"); | ||
| 249 | - if (motZoomStepString != null) { | ||
| 250 | - try { | ||
| 251 | - double motZoomStep = Double.parseDouble(motZoomStepString.trim()); | ||
| 252 | - int tenZoomStep = (int) (10.0 * motZoomStep); | ||
| 253 | - if (tenZoomStep > 1) { | ||
| 254 | - tenDesiredZoom -= tenDesiredZoom % tenZoomStep; | ||
| 255 | - } | ||
| 256 | - } catch (NumberFormatException nfe) { | ||
| 257 | - // continue | ||
| 258 | - } | ||
| 259 | - } | ||
| 260 | - | ||
| 261 | - // Set zoom. This helps encourage the user to pull back. | ||
| 262 | - // Some devices like the Behold have a zoom parameter | ||
| 263 | - if (maxZoomString != null || motZoomValuesString != null) { | ||
| 264 | - parameters.set("zoom", String.valueOf(tenDesiredZoom / 10.0)); | ||
| 265 | - } | ||
| 266 | - | ||
| 267 | - // Most devices, like the Hero, appear to expose this zoom parameter. | ||
| 268 | - // It takes on values like "27" which appears to mean 2.7x zoom | ||
| 269 | - if (takingPictureZoomMaxString != null) { | ||
| 270 | - parameters.set("taking-picture-zoom", tenDesiredZoom); | ||
| 271 | - } | ||
| 272 | - } | ||
| 273 | - | ||
| 274 | - public static int getDesiredSharpness() { | ||
| 275 | - return DESIRED_SHARPNESS; | ||
| 276 | - } | ||
| 277 | - | ||
| 278 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/camera/CameraManager.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2008 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.camera; | ||
| 18 | - | ||
| 19 | -import android.content.Context; | ||
| 20 | -import android.graphics.PixelFormat; | ||
| 21 | -import android.graphics.Point; | ||
| 22 | -import android.graphics.Rect; | ||
| 23 | -import android.hardware.Camera; | ||
| 24 | -import android.os.Build; | ||
| 25 | -import android.os.Handler; | ||
| 26 | -import android.view.SurfaceHolder; | ||
| 27 | - | ||
| 28 | -import java.io.IOException; | ||
| 29 | - | ||
| 30 | -/** | ||
| 31 | - * This object wraps the Camera service object and expects to be the only one talking to it. The | ||
| 32 | - * implementation encapsulates the steps needed to take preview-sized images, which are used for | ||
| 33 | - * both preview and decoding. | ||
| 34 | - */ | ||
| 35 | -public final class CameraManager { | ||
| 36 | - | ||
| 37 | - private static final String TAG = CameraManager.class.getSimpleName(); | ||
| 38 | - | ||
| 39 | - public static int FRAME_WIDTH = -1; | ||
| 40 | - public static int FRAME_HEIGHT = -1; | ||
| 41 | - public static int FRAME_MARGINTOP = -1; | ||
| 42 | - | ||
| 43 | - private static CameraManager cameraManager; | ||
| 44 | - | ||
| 45 | - static final int SDK_INT; // Later we can use Build.VERSION.SDK_INT | ||
| 46 | - | ||
| 47 | - static { | ||
| 48 | - int sdkInt; | ||
| 49 | - try { | ||
| 50 | - sdkInt = Integer.parseInt(Build.VERSION.SDK); | ||
| 51 | - } catch (NumberFormatException nfe) { | ||
| 52 | - // Just to be safe | ||
| 53 | - sdkInt = 10000; | ||
| 54 | - } | ||
| 55 | - SDK_INT = sdkInt; | ||
| 56 | - } | ||
| 57 | - | ||
| 58 | - private final Context context; | ||
| 59 | - private final CameraConfigurationManager configManager; | ||
| 60 | - private Camera camera; | ||
| 61 | - private Rect framingRect; | ||
| 62 | - private Rect framingRectInPreview; | ||
| 63 | - private boolean initialized; | ||
| 64 | - private boolean previewing; | ||
| 65 | - private final boolean useOneShotPreviewCallback; | ||
| 66 | - /** | ||
| 67 | - * Preview frames are delivered here, which we pass on to the registered handler. Make sure to | ||
| 68 | - * clear the handler so it will only receive one message. | ||
| 69 | - */ | ||
| 70 | - private final PreviewCallback previewCallback; | ||
| 71 | - /** | ||
| 72 | - * Autofocus callbacks arrive here, and are dispatched to the Handler which requested them. | ||
| 73 | - */ | ||
| 74 | - private final AutoFocusCallback autoFocusCallback; | ||
| 75 | - | ||
| 76 | - /** | ||
| 77 | - * Initializes this static object with the Context of the calling Activity. | ||
| 78 | - * | ||
| 79 | - * @param context The Activity which wants to use the camera. | ||
| 80 | - */ | ||
| 81 | - public static void init(Context context) { | ||
| 82 | - if (cameraManager == null) { | ||
| 83 | - cameraManager = new CameraManager(context); | ||
| 84 | - } | ||
| 85 | - } | ||
| 86 | - | ||
| 87 | - /** | ||
| 88 | - * Gets the CameraManager singleton instance. | ||
| 89 | - * | ||
| 90 | - * @return A reference to the CameraManager singleton. | ||
| 91 | - */ | ||
| 92 | - public static CameraManager get() { | ||
| 93 | - return cameraManager; | ||
| 94 | - } | ||
| 95 | - | ||
| 96 | - private CameraManager(Context context) { | ||
| 97 | - | ||
| 98 | - this.context = context; | ||
| 99 | - this.configManager = new CameraConfigurationManager(context); | ||
| 100 | - | ||
| 101 | - // Camera.setOneShotPreviewCallback() has a race condition in Cupcake, so we use the older | ||
| 102 | - // Camera.setPreviewCallback() on 1.5 and earlier. For Donut and later, we need to use | ||
| 103 | - // the more efficient one shot callback, as the older one can swamp the system and cause it | ||
| 104 | - // to run out of memory. We can't use SDK_INT because it was introduced in the Donut SDK. | ||
| 105 | - //useOneShotPreviewCallback = Integer.parseInt(Build.VERSION.SDK) > Build.VERSION_CODES.CUPCAKE; | ||
| 106 | - useOneShotPreviewCallback = Integer.parseInt(Build.VERSION.SDK) > 3; // 3 = Cupcake | ||
| 107 | - | ||
| 108 | - previewCallback = new PreviewCallback(configManager, useOneShotPreviewCallback); | ||
| 109 | - autoFocusCallback = new AutoFocusCallback(); | ||
| 110 | - } | ||
| 111 | - | ||
| 112 | - /** | ||
| 113 | - * Opens the camera driver and initializes the hardware parameters. | ||
| 114 | - * | ||
| 115 | - * @param holder The surface object which the camera will draw preview frames into. | ||
| 116 | - * @throws IOException Indicates the camera driver failed to open. | ||
| 117 | - */ | ||
| 118 | - public void openDriver(SurfaceHolder holder) throws IOException { | ||
| 119 | - if (camera == null) { | ||
| 120 | - camera = Camera.open(); | ||
| 121 | - if (camera == null) { | ||
| 122 | - throw new IOException(); | ||
| 123 | - } | ||
| 124 | - camera.setPreviewDisplay(holder); | ||
| 125 | - | ||
| 126 | - if (!initialized) { | ||
| 127 | - initialized = true; | ||
| 128 | - configManager.initFromCameraParameters(camera); | ||
| 129 | - } | ||
| 130 | - configManager.setDesiredCameraParameters(camera); | ||
| 131 | - | ||
| 132 | - //FIXME | ||
| 133 | - // SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); | ||
| 134 | - //�Ƿ�ʹ��ǰ�� | ||
| 135 | -// if (prefs.getBoolean(PreferencesActivity.KEY_FRONT_LIGHT, false)) { | ||
| 136 | -// FlashlightManager.enableFlashlight(); | ||
| 137 | -// } | ||
| 138 | - FlashlightManager.enableFlashlight(); | ||
| 139 | - } | ||
| 140 | - } | ||
| 141 | - | ||
| 142 | - /** | ||
| 143 | - * Closes the camera driver if still in use. | ||
| 144 | - */ | ||
| 145 | - public void closeDriver() { | ||
| 146 | - if (camera != null) { | ||
| 147 | - FlashlightManager.disableFlashlight(); | ||
| 148 | - camera.release(); | ||
| 149 | - camera = null; | ||
| 150 | - } | ||
| 151 | - } | ||
| 152 | - | ||
| 153 | - /** | ||
| 154 | - * Asks the camera hardware to begin drawing preview frames to the screen. | ||
| 155 | - */ | ||
| 156 | - public void startPreview() { | ||
| 157 | - if (camera != null && !previewing) { | ||
| 158 | - camera.startPreview(); | ||
| 159 | - previewing = true; | ||
| 160 | - } | ||
| 161 | - } | ||
| 162 | - | ||
| 163 | - /** | ||
| 164 | - * Tells the camera to stop drawing preview frames. | ||
| 165 | - */ | ||
| 166 | - public void stopPreview() { | ||
| 167 | - if (camera != null && previewing) { | ||
| 168 | - if (!useOneShotPreviewCallback) { | ||
| 169 | - camera.setPreviewCallback(null); | ||
| 170 | - } | ||
| 171 | - camera.stopPreview(); | ||
| 172 | - previewCallback.setHandler(null, 0); | ||
| 173 | - autoFocusCallback.setHandler(null, 0); | ||
| 174 | - previewing = false; | ||
| 175 | - } | ||
| 176 | - } | ||
| 177 | - | ||
| 178 | - /** | ||
| 179 | - * A single preview frame will be returned to the handler supplied. The data will arrive as byte[] | ||
| 180 | - * in the message.obj field, with width and height encoded as message.arg1 and message.arg2, | ||
| 181 | - * respectively. | ||
| 182 | - * | ||
| 183 | - * @param handler The handler to send the message to. | ||
| 184 | - * @param message The what field of the message to be sent. | ||
| 185 | - */ | ||
| 186 | - public void requestPreviewFrame(Handler handler, int message) { | ||
| 187 | - if (camera != null && previewing) { | ||
| 188 | - previewCallback.setHandler(handler, message); | ||
| 189 | - if (useOneShotPreviewCallback) { | ||
| 190 | - camera.setOneShotPreviewCallback(previewCallback); | ||
| 191 | - } else { | ||
| 192 | - camera.setPreviewCallback(previewCallback); | ||
| 193 | - } | ||
| 194 | - } | ||
| 195 | - } | ||
| 196 | - | ||
| 197 | - /** | ||
| 198 | - * Asks the camera hardware to perform an autofocus. | ||
| 199 | - * | ||
| 200 | - * @param handler The Handler to notify when the autofocus completes. | ||
| 201 | - * @param message The message to deliver. | ||
| 202 | - */ | ||
| 203 | - public void requestAutoFocus(Handler handler, int message) { | ||
| 204 | - if (camera != null && previewing) { | ||
| 205 | - autoFocusCallback.setHandler(handler, message); | ||
| 206 | - //Log.d(TAG, "Requesting auto-focus callback"); | ||
| 207 | - camera.autoFocus(autoFocusCallback); | ||
| 208 | - } | ||
| 209 | - } | ||
| 210 | - | ||
| 211 | - /** | ||
| 212 | - * Calculates the framing rect which the UI should draw to show the user where to place the | ||
| 213 | - * barcode. This target helps with alignment as well as forces the user to hold the device | ||
| 214 | - * far enough away to ensure the image will be in focus. | ||
| 215 | - * | ||
| 216 | - * @return The rectangle to draw on screen in window coordinates. | ||
| 217 | - */ | ||
| 218 | - public Rect getFramingRect() { | ||
| 219 | - try { | ||
| 220 | - Point screenResolution = configManager.getScreenResolution(); | ||
| 221 | - // if (framingRect == null) { | ||
| 222 | - if (camera == null) { | ||
| 223 | - return null; | ||
| 224 | - } | ||
| 225 | - | ||
| 226 | - int leftOffset = (screenResolution.x - FRAME_WIDTH) / 2; | ||
| 227 | - | ||
| 228 | - int topOffset; | ||
| 229 | - if (FRAME_MARGINTOP != -1) { | ||
| 230 | - topOffset = FRAME_MARGINTOP; | ||
| 231 | - } else { | ||
| 232 | - topOffset = (screenResolution.y - FRAME_HEIGHT) / 2; | ||
| 233 | - } | ||
| 234 | - framingRect = new Rect(leftOffset, topOffset, leftOffset + FRAME_WIDTH, topOffset + FRAME_HEIGHT); | ||
| 235 | - // } | ||
| 236 | - return framingRect; | ||
| 237 | - } catch (Exception e) { | ||
| 238 | - e.printStackTrace(); | ||
| 239 | - return null; | ||
| 240 | - } | ||
| 241 | - } | ||
| 242 | - | ||
| 243 | - /** | ||
| 244 | - * Like {@link #getFramingRect} but coordinates are in terms of the preview frame, | ||
| 245 | - * not UI / screen. | ||
| 246 | - */ | ||
| 247 | - public Rect getFramingRectInPreview() { | ||
| 248 | - if (framingRectInPreview == null) { | ||
| 249 | - Rect rect = new Rect(getFramingRect()); | ||
| 250 | - Point cameraResolution = configManager.getCameraResolution(); | ||
| 251 | - Point screenResolution = configManager.getScreenResolution(); | ||
| 252 | - //modify here | ||
| 253 | -// rect.left = rect.left * cameraResolution.x / screenResolution.x; | ||
| 254 | -// rect.right = rect.right * cameraResolution.x / screenResolution.x; | ||
| 255 | -// rect.top = rect.top * cameraResolution.y / screenResolution.y; | ||
| 256 | -// rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y; | ||
| 257 | - rect.left = rect.left * cameraResolution.y / screenResolution.x; | ||
| 258 | - rect.right = rect.right * cameraResolution.y / screenResolution.x; | ||
| 259 | - rect.top = rect.top * cameraResolution.x / screenResolution.y; | ||
| 260 | - rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y; | ||
| 261 | - framingRectInPreview = rect; | ||
| 262 | - } | ||
| 263 | - return framingRectInPreview; | ||
| 264 | - } | ||
| 265 | - | ||
| 266 | - /** | ||
| 267 | - * Converts the result points from still resolution coordinates to screen coordinates. | ||
| 268 | - * | ||
| 269 | - * @param points The points returned by the Reader subclass through Result.getResultPoints(). | ||
| 270 | - * @return An array of Points scaled to the size of the framing rect and offset appropriately | ||
| 271 | - * so they can be drawn in screen coordinates. | ||
| 272 | - */ | ||
| 273 | - /* | ||
| 274 | - public Point[] convertResultPoints(ResultPoint[] points) { | ||
| 275 | - Rect frame = getFramingRectInPreview(); | ||
| 276 | - int count = points.length; | ||
| 277 | - Point[] output = new Point[count]; | ||
| 278 | - for (int x = 0; x < count; x++) { | ||
| 279 | - output[x] = new Point(); | ||
| 280 | - output[x].x = frame.left + (int) (points[x].getX() + 0.5f); | ||
| 281 | - output[x].y = frame.top + (int) (points[x].getY() + 0.5f); | ||
| 282 | - } | ||
| 283 | - return output; | ||
| 284 | - } | ||
| 285 | - */ | ||
| 286 | - | ||
| 287 | - /** | ||
| 288 | - * A factory method to build the appropriate LuminanceSource object based on the format | ||
| 289 | - * of the preview buffers, as described by Camera.Parameters. | ||
| 290 | - * | ||
| 291 | - * @param data A preview frame. | ||
| 292 | - * @param width The width of the image. | ||
| 293 | - * @param height The height of the image. | ||
| 294 | - * @return A PlanarYUVLuminanceSource instance. | ||
| 295 | - */ | ||
| 296 | - public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) { | ||
| 297 | - Rect rect = getFramingRectInPreview(); | ||
| 298 | - int previewFormat = configManager.getPreviewFormat(); | ||
| 299 | - String previewFormatString = configManager.getPreviewFormatString(); | ||
| 300 | - switch (previewFormat) { | ||
| 301 | - // This is the standard Android format which all devices are REQUIRED to support. | ||
| 302 | - // In theory, it's the only one we should ever care about. | ||
| 303 | - case PixelFormat.YCbCr_420_SP: | ||
| 304 | - // This format has never been seen in the wild, but is compatible as we only care | ||
| 305 | - // about the Y channel, so allow it. | ||
| 306 | - case PixelFormat.YCbCr_422_SP: | ||
| 307 | - return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top, | ||
| 308 | - rect.width(), rect.height()); | ||
| 309 | - default: | ||
| 310 | - // The Samsung Moment incorrectly uses this variant instead of the 'sp' version. | ||
| 311 | - // Fortunately, it too has all the Y data up front, so we can read it. | ||
| 312 | - if ("yuv420p".equals(previewFormatString)) { | ||
| 313 | - return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top, | ||
| 314 | - rect.width(), rect.height()); | ||
| 315 | - } | ||
| 316 | - } | ||
| 317 | - throw new IllegalArgumentException("Unsupported picture format: " + | ||
| 318 | - previewFormat + '/' + previewFormatString); | ||
| 319 | - } | ||
| 320 | - | ||
| 321 | - public Context getContext() { | ||
| 322 | - return context; | ||
| 323 | - } | ||
| 324 | - | ||
| 325 | - public Camera getCamera() { | ||
| 326 | - return camera; | ||
| 327 | - } | ||
| 328 | - | ||
| 329 | - public boolean isPreviewing() { | ||
| 330 | - return previewing; | ||
| 331 | - } | ||
| 332 | - | ||
| 333 | - public boolean isUseOneShotPreviewCallback() { | ||
| 334 | - return useOneShotPreviewCallback; | ||
| 335 | - } | ||
| 336 | - | ||
| 337 | - public PreviewCallback getPreviewCallback() { | ||
| 338 | - return previewCallback; | ||
| 339 | - } | ||
| 340 | - | ||
| 341 | - public AutoFocusCallback getAutoFocusCallback() { | ||
| 342 | - return autoFocusCallback; | ||
| 343 | - } | ||
| 344 | - | ||
| 345 | - public void setPreviewing(boolean previewing) { | ||
| 346 | - this.previewing = previewing; | ||
| 347 | - } | ||
| 348 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/camera/FlashlightManager.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2010 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.camera; | ||
| 18 | - | ||
| 19 | -import android.os.IBinder; | ||
| 20 | -import android.util.Log; | ||
| 21 | - | ||
| 22 | -import java.lang.reflect.InvocationTargetException; | ||
| 23 | -import java.lang.reflect.Method; | ||
| 24 | - | ||
| 25 | -/** | ||
| 26 | - * This class is used to activate the weak light on some camera phones (not flash) | ||
| 27 | - * in order to illuminate surfaces for scanning. There is no official way to do this, | ||
| 28 | - * but, classes which allow access to this function still exist on some devices. | ||
| 29 | - * This therefore proceeds through a great deal of reflection. | ||
| 30 | - * <p> | ||
| 31 | - * See <a href="http://almondmendoza.com/2009/01/05/changing-the-screen-brightness-programatically/"> | ||
| 32 | - * http://almondmendoza.com/2009/01/05/changing-the-screen-brightness-programatically/</a> and | ||
| 33 | - * <a href="http://code.google.com/p/droidled/source/browse/trunk/src/com/droidled/demo/DroidLED.java"> | ||
| 34 | - * http://code.google.com/p/droidled/source/browse/trunk/src/com/droidled/demo/DroidLED.java</a>. | ||
| 35 | - * Thanks to Ryan Alford for pointing out the availability of this class. | ||
| 36 | - */ | ||
| 37 | -final class FlashlightManager { | ||
| 38 | - | ||
| 39 | - private static final String TAG = FlashlightManager.class.getSimpleName(); | ||
| 40 | - | ||
| 41 | - private static final Object iHardwareService; | ||
| 42 | - private static final Method setFlashEnabledMethod; | ||
| 43 | - | ||
| 44 | - static { | ||
| 45 | - iHardwareService = getHardwareService(); | ||
| 46 | - setFlashEnabledMethod = getSetFlashEnabledMethod(iHardwareService); | ||
| 47 | - if (iHardwareService == null) { | ||
| 48 | - Log.v(TAG, "This device does supports control of a flashlight"); | ||
| 49 | - } else { | ||
| 50 | - Log.v(TAG, "This device does not support control of a flashlight"); | ||
| 51 | - } | ||
| 52 | - } | ||
| 53 | - | ||
| 54 | - private FlashlightManager() { | ||
| 55 | - } | ||
| 56 | - | ||
| 57 | - /** | ||
| 58 | - * �����������ƿ��� | ||
| 59 | - */ | ||
| 60 | - //FIXME | ||
| 61 | - static void enableFlashlight() { | ||
| 62 | - setFlashlight(false); | ||
| 63 | - } | ||
| 64 | - | ||
| 65 | - static void disableFlashlight() { | ||
| 66 | - setFlashlight(false); | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - private static Object getHardwareService() { | ||
| 70 | - Class<?> serviceManagerClass = maybeForName("android.os.ServiceManager"); | ||
| 71 | - if (serviceManagerClass == null) { | ||
| 72 | - return null; | ||
| 73 | - } | ||
| 74 | - | ||
| 75 | - Method getServiceMethod = maybeGetMethod(serviceManagerClass, "getService", String.class); | ||
| 76 | - if (getServiceMethod == null) { | ||
| 77 | - return null; | ||
| 78 | - } | ||
| 79 | - | ||
| 80 | - Object hardwareService = invoke(getServiceMethod, null, "hardware"); | ||
| 81 | - if (hardwareService == null) { | ||
| 82 | - return null; | ||
| 83 | - } | ||
| 84 | - | ||
| 85 | - Class<?> iHardwareServiceStubClass = maybeForName("android.os.IHardwareService$Stub"); | ||
| 86 | - if (iHardwareServiceStubClass == null) { | ||
| 87 | - return null; | ||
| 88 | - } | ||
| 89 | - | ||
| 90 | - Method asInterfaceMethod = maybeGetMethod(iHardwareServiceStubClass, "asInterface", IBinder.class); | ||
| 91 | - if (asInterfaceMethod == null) { | ||
| 92 | - return null; | ||
| 93 | - } | ||
| 94 | - | ||
| 95 | - return invoke(asInterfaceMethod, null, hardwareService); | ||
| 96 | - } | ||
| 97 | - | ||
| 98 | - private static Method getSetFlashEnabledMethod(Object iHardwareService) { | ||
| 99 | - if (iHardwareService == null) { | ||
| 100 | - return null; | ||
| 101 | - } | ||
| 102 | - Class<?> proxyClass = iHardwareService.getClass(); | ||
| 103 | - return maybeGetMethod(proxyClass, "setFlashlightEnabled", boolean.class); | ||
| 104 | - } | ||
| 105 | - | ||
| 106 | - private static Class<?> maybeForName(String name) { | ||
| 107 | - try { | ||
| 108 | - return Class.forName(name); | ||
| 109 | - } catch (ClassNotFoundException cnfe) { | ||
| 110 | - // OK | ||
| 111 | - return null; | ||
| 112 | - } catch (RuntimeException re) { | ||
| 113 | - Log.w(TAG, "Unexpected error while finding class " + name, re); | ||
| 114 | - return null; | ||
| 115 | - } | ||
| 116 | - } | ||
| 117 | - | ||
| 118 | - private static Method maybeGetMethod(Class<?> clazz, String name, Class<?>... argClasses) { | ||
| 119 | - try { | ||
| 120 | - return clazz.getMethod(name, argClasses); | ||
| 121 | - } catch (NoSuchMethodException nsme) { | ||
| 122 | - // OK | ||
| 123 | - return null; | ||
| 124 | - } catch (RuntimeException re) { | ||
| 125 | - Log.w(TAG, "Unexpected error while finding method " + name, re); | ||
| 126 | - return null; | ||
| 127 | - } | ||
| 128 | - } | ||
| 129 | - | ||
| 130 | - private static Object invoke(Method method, Object instance, Object... args) { | ||
| 131 | - try { | ||
| 132 | - return method.invoke(instance, args); | ||
| 133 | - } catch (IllegalAccessException e) { | ||
| 134 | - Log.w(TAG, "Unexpected error while invoking " + method, e); | ||
| 135 | - return null; | ||
| 136 | - } catch (InvocationTargetException e) { | ||
| 137 | - Log.w(TAG, "Unexpected error while invoking " + method, e.getCause()); | ||
| 138 | - return null; | ||
| 139 | - } catch (RuntimeException re) { | ||
| 140 | - Log.w(TAG, "Unexpected error while invoking " + method, re); | ||
| 141 | - return null; | ||
| 142 | - } | ||
| 143 | - } | ||
| 144 | - | ||
| 145 | - private static void setFlashlight(boolean active) { | ||
| 146 | - if (iHardwareService != null) { | ||
| 147 | - invoke(setFlashEnabledMethod, iHardwareService, active); | ||
| 148 | - } | ||
| 149 | - } | ||
| 150 | - | ||
| 151 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/camera/PlanarYUVLuminanceSource.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright 2009 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.camera; | ||
| 18 | - | ||
| 19 | -import android.graphics.Bitmap; | ||
| 20 | - | ||
| 21 | -import com.google.zxing.LuminanceSource; | ||
| 22 | - | ||
| 23 | -/** | ||
| 24 | - * This object extends LuminanceSource around an array of YUV data returned from the camera driver, | ||
| 25 | - * with the option to crop to a rectangle within the full data. This can be used to exclude | ||
| 26 | - * superfluous pixels around the perimeter and speed up decoding. | ||
| 27 | - * <p> | ||
| 28 | - * It works for any pixel format where the Y channel is planar and appears first, including | ||
| 29 | - * YCbCr_420_SP and YCbCr_422_SP. | ||
| 30 | - * | ||
| 31 | - * @author dswitkin@google.com (Daniel Switkin) | ||
| 32 | - */ | ||
| 33 | -public final class PlanarYUVLuminanceSource extends LuminanceSource { | ||
| 34 | - private final byte[] yuvData; | ||
| 35 | - private final int dataWidth; | ||
| 36 | - private final int dataHeight; | ||
| 37 | - private final int left; | ||
| 38 | - private final int top; | ||
| 39 | - | ||
| 40 | - public PlanarYUVLuminanceSource(byte[] yuvData, int dataWidth, int dataHeight, int left, int top, | ||
| 41 | - int width, int height) { | ||
| 42 | - super(width, height); | ||
| 43 | - | ||
| 44 | - if (left + width > dataWidth || top + height > dataHeight) { | ||
| 45 | - throw new IllegalArgumentException("Crop rectangle does not fit within image data."); | ||
| 46 | - } | ||
| 47 | - | ||
| 48 | - this.yuvData = yuvData; | ||
| 49 | - this.dataWidth = dataWidth; | ||
| 50 | - this.dataHeight = dataHeight; | ||
| 51 | - this.left = left; | ||
| 52 | - this.top = top; | ||
| 53 | - } | ||
| 54 | - | ||
| 55 | - @Override | ||
| 56 | - public byte[] getRow(int y, byte[] row) { | ||
| 57 | - if (y < 0 || y >= getHeight()) { | ||
| 58 | - throw new IllegalArgumentException("Requested row is outside the image: " + y); | ||
| 59 | - } | ||
| 60 | - int width = getWidth(); | ||
| 61 | - if (row == null || row.length < width) { | ||
| 62 | - row = new byte[width]; | ||
| 63 | - } | ||
| 64 | - int offset = (y + top) * dataWidth + left; | ||
| 65 | - System.arraycopy(yuvData, offset, row, 0, width); | ||
| 66 | - return row; | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - @Override | ||
| 70 | - public byte[] getMatrix() { | ||
| 71 | - int width = getWidth(); | ||
| 72 | - int height = getHeight(); | ||
| 73 | - | ||
| 74 | - // If the caller asks for the entire underlying image, save the copy and give them the | ||
| 75 | - // original data. The docs specifically warn that result.length must be ignored. | ||
| 76 | - if (width == dataWidth && height == dataHeight) { | ||
| 77 | - return yuvData; | ||
| 78 | - } | ||
| 79 | - | ||
| 80 | - int area = width * height; | ||
| 81 | - byte[] matrix = new byte[area]; | ||
| 82 | - int inputOffset = top * dataWidth + left; | ||
| 83 | - | ||
| 84 | - // If the width matches the full width of the underlying data, perform a single copy. | ||
| 85 | - if (width == dataWidth) { | ||
| 86 | - System.arraycopy(yuvData, inputOffset, matrix, 0, area); | ||
| 87 | - return matrix; | ||
| 88 | - } | ||
| 89 | - | ||
| 90 | - // Otherwise copy one cropped row at a time. | ||
| 91 | - byte[] yuv = yuvData; | ||
| 92 | - for (int y = 0; y < height; y++) { | ||
| 93 | - int outputOffset = y * width; | ||
| 94 | - System.arraycopy(yuv, inputOffset, matrix, outputOffset, width); | ||
| 95 | - inputOffset += dataWidth; | ||
| 96 | - } | ||
| 97 | - return matrix; | ||
| 98 | - } | ||
| 99 | - | ||
| 100 | - @Override | ||
| 101 | - public boolean isCropSupported() { | ||
| 102 | - return true; | ||
| 103 | - } | ||
| 104 | - | ||
| 105 | - public int getDataWidth() { | ||
| 106 | - return dataWidth; | ||
| 107 | - } | ||
| 108 | - | ||
| 109 | - public int getDataHeight() { | ||
| 110 | - return dataHeight; | ||
| 111 | - } | ||
| 112 | - | ||
| 113 | - public Bitmap renderCroppedGreyscaleBitmap() { | ||
| 114 | - int width = getWidth(); | ||
| 115 | - int height = getHeight(); | ||
| 116 | - int[] pixels = new int[width * height]; | ||
| 117 | - byte[] yuv = yuvData; | ||
| 118 | - int inputOffset = top * dataWidth + left; | ||
| 119 | - | ||
| 120 | - for (int y = 0; y < height; y++) { | ||
| 121 | - int outputOffset = y * width; | ||
| 122 | - for (int x = 0; x < width; x++) { | ||
| 123 | - int grey = yuv[inputOffset + x] & 0xff; | ||
| 124 | - pixels[outputOffset + x] = 0xFF000000 | (grey * 0x00010101); | ||
| 125 | - } | ||
| 126 | - inputOffset += dataWidth; | ||
| 127 | - } | ||
| 128 | - | ||
| 129 | - Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); | ||
| 130 | - bitmap.setPixels(pixels, 0, width, 0, 0, width, height); | ||
| 131 | - return bitmap; | ||
| 132 | - } | ||
| 133 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/camera/PreviewCallback.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2010 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.camera; | ||
| 18 | - | ||
| 19 | -import android.graphics.Point; | ||
| 20 | -import android.hardware.Camera; | ||
| 21 | -import android.os.Handler; | ||
| 22 | -import android.os.Message; | ||
| 23 | -import android.util.Log; | ||
| 24 | - | ||
| 25 | -public final class PreviewCallback implements Camera.PreviewCallback { | ||
| 26 | - | ||
| 27 | - private static final String TAG = PreviewCallback.class.getSimpleName(); | ||
| 28 | - | ||
| 29 | - private final CameraConfigurationManager configManager; | ||
| 30 | - private final boolean useOneShotPreviewCallback; | ||
| 31 | - private Handler previewHandler; | ||
| 32 | - private int previewMessage; | ||
| 33 | - | ||
| 34 | - PreviewCallback(CameraConfigurationManager configManager, boolean useOneShotPreviewCallback) { | ||
| 35 | - this.configManager = configManager; | ||
| 36 | - this.useOneShotPreviewCallback = useOneShotPreviewCallback; | ||
| 37 | - } | ||
| 38 | - | ||
| 39 | - public void setHandler(Handler previewHandler, int previewMessage) { | ||
| 40 | - this.previewHandler = previewHandler; | ||
| 41 | - this.previewMessage = previewMessage; | ||
| 42 | - } | ||
| 43 | - | ||
| 44 | - public void onPreviewFrame(byte[] data, Camera camera) { | ||
| 45 | - Point cameraResolution = configManager.getCameraResolution(); | ||
| 46 | - if (!useOneShotPreviewCallback) { | ||
| 47 | - camera.setPreviewCallback(null); | ||
| 48 | - } | ||
| 49 | - if (previewHandler != null) { | ||
| 50 | - Message message = previewHandler.obtainMessage(previewMessage, cameraResolution.x, | ||
| 51 | - cameraResolution.y, data); | ||
| 52 | - message.sendToTarget(); | ||
| 53 | - previewHandler = null; | ||
| 54 | - } else { | ||
| 55 | - Log.d(TAG, "Got preview callback, but no handler for it"); | ||
| 56 | - } | ||
| 57 | - } | ||
| 58 | - | ||
| 59 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/decoding/CaptureActivityHandler.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2008 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.decoding; | ||
| 18 | - | ||
| 19 | -import android.app.Activity; | ||
| 20 | -import android.content.Intent; | ||
| 21 | -import android.graphics.Bitmap; | ||
| 22 | -import android.net.Uri; | ||
| 23 | -import android.os.Bundle; | ||
| 24 | -import android.os.Handler; | ||
| 25 | -import android.os.Message; | ||
| 26 | -import android.util.Log; | ||
| 27 | - | ||
| 28 | -import com.cnlive.cloud.shanghaishop.R; | ||
| 29 | -import com.google.zxing.BarcodeFormat; | ||
| 30 | -import com.google.zxing.Result; | ||
| 31 | -import com.uuzuche.lib_zxing.activity.CaptureFragment; | ||
| 32 | -import com.uuzuche.lib_zxing.camera.CameraManager; | ||
| 33 | -import com.uuzuche.lib_zxing.view.ViewfinderResultPointCallback; | ||
| 34 | -import com.uuzuche.lib_zxing.view.ViewfinderView; | ||
| 35 | - | ||
| 36 | -import java.util.Vector; | ||
| 37 | - | ||
| 38 | -/** | ||
| 39 | - * This class handles all the messaging which comprises the state machine for capture. | ||
| 40 | - */ | ||
| 41 | -public final class CaptureActivityHandler extends Handler { | ||
| 42 | - | ||
| 43 | - private static final String TAG = CaptureActivityHandler.class.getSimpleName(); | ||
| 44 | - | ||
| 45 | - private final CaptureFragment fragment; | ||
| 46 | - private final DecodeThread decodeThread; | ||
| 47 | - private State state; | ||
| 48 | - | ||
| 49 | - private enum State { | ||
| 50 | - PREVIEW, | ||
| 51 | - SUCCESS, | ||
| 52 | - DONE | ||
| 53 | - } | ||
| 54 | - | ||
| 55 | - public CaptureActivityHandler(CaptureFragment fragment, Vector<BarcodeFormat> decodeFormats, | ||
| 56 | - String characterSet, ViewfinderView viewfinderView) { | ||
| 57 | - this.fragment = fragment; | ||
| 58 | - decodeThread = new DecodeThread(fragment, decodeFormats, characterSet, | ||
| 59 | - new ViewfinderResultPointCallback(viewfinderView)); | ||
| 60 | - decodeThread.start(); | ||
| 61 | - state = State.SUCCESS; | ||
| 62 | - // Start ourselves capturing previews and decoding. | ||
| 63 | - CameraManager.get().startPreview(); | ||
| 64 | - restartPreviewAndDecode(); | ||
| 65 | - } | ||
| 66 | - | ||
| 67 | - @Override | ||
| 68 | - public void handleMessage(Message message) { | ||
| 69 | - if (message.what == R.id.auto_focus) { | ||
| 70 | - //Log.d(TAG, "Got auto-focus message"); | ||
| 71 | - // When one auto focus pass finishes, start another. This is the closest thing to | ||
| 72 | - // continuous AF. It does seem to hunt a bit, but I'm not sure what else to do. | ||
| 73 | - if (state == State.PREVIEW) { | ||
| 74 | - CameraManager.get().requestAutoFocus(this, R.id.auto_focus); | ||
| 75 | - } | ||
| 76 | - } else if (message.what == R.id.restart_preview) { | ||
| 77 | - Log.d(TAG, "Got restart preview message"); | ||
| 78 | - restartPreviewAndDecode(); | ||
| 79 | - } else if (message.what == R.id.decode_succeeded) { | ||
| 80 | - Log.d(TAG, "Got decode succeeded message"); | ||
| 81 | - state = State.SUCCESS; | ||
| 82 | - Bundle bundle = message.getData(); | ||
| 83 | - | ||
| 84 | - /***********************************************************************/ | ||
| 85 | - Bitmap barcode = bundle == null ? null : | ||
| 86 | - (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);//���ñ����߳� | ||
| 87 | - | ||
| 88 | - fragment.handleDecode((Result) message.obj, barcode);//���ؽ�� | ||
| 89 | - /***********************************************************************/ | ||
| 90 | - } else if (message.what == R.id.decode_failed) { | ||
| 91 | - // We're decoding as fast as possible, so when one decode fails, start another. | ||
| 92 | - state = State.PREVIEW; | ||
| 93 | - CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode); | ||
| 94 | - } else if (message.what == R.id.return_scan_result) { | ||
| 95 | - Log.d(TAG, "Got return scan result message"); | ||
| 96 | - fragment.getActivity().setResult(Activity.RESULT_OK, (Intent) message.obj); | ||
| 97 | - fragment.getActivity().finish(); | ||
| 98 | - } else if (message.what == R.id.launch_product_query) { | ||
| 99 | - Log.d(TAG, "Got product query message"); | ||
| 100 | - String url = (String) message.obj; | ||
| 101 | - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); | ||
| 102 | - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); | ||
| 103 | - fragment.getActivity().startActivity(intent); | ||
| 104 | - } | ||
| 105 | - } | ||
| 106 | - | ||
| 107 | - public void quitSynchronously() { | ||
| 108 | - state = State.DONE; | ||
| 109 | - CameraManager.get().stopPreview(); | ||
| 110 | - Message quit = Message.obtain(decodeThread.getHandler(), R.id.quit); | ||
| 111 | - quit.sendToTarget(); | ||
| 112 | - try { | ||
| 113 | - decodeThread.join(); | ||
| 114 | - } catch (InterruptedException e) { | ||
| 115 | - // continue | ||
| 116 | - } | ||
| 117 | - | ||
| 118 | - // Be absolutely sure we don't send any queued up messages | ||
| 119 | - removeMessages(R.id.decode_succeeded); | ||
| 120 | - removeMessages(R.id.decode_failed); | ||
| 121 | - } | ||
| 122 | - | ||
| 123 | - private void restartPreviewAndDecode() { | ||
| 124 | - if (state == State.SUCCESS) { | ||
| 125 | - state = State.PREVIEW; | ||
| 126 | - CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode); | ||
| 127 | - CameraManager.get().requestAutoFocus(this, R.id.auto_focus); | ||
| 128 | - fragment.drawViewfinder(); | ||
| 129 | - } | ||
| 130 | - } | ||
| 131 | - | ||
| 132 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/decoding/DecodeFormatManager.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2010 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.decoding; | ||
| 18 | - | ||
| 19 | -import android.content.Intent; | ||
| 20 | -import android.net.Uri; | ||
| 21 | - | ||
| 22 | -import com.google.zxing.BarcodeFormat; | ||
| 23 | - | ||
| 24 | -import java.util.Arrays; | ||
| 25 | -import java.util.List; | ||
| 26 | -import java.util.Vector; | ||
| 27 | -import java.util.regex.Pattern; | ||
| 28 | - | ||
| 29 | -public class DecodeFormatManager { | ||
| 30 | - | ||
| 31 | - private static final Pattern COMMA_PATTERN = Pattern.compile(","); | ||
| 32 | - | ||
| 33 | - public static final Vector<BarcodeFormat> PRODUCT_FORMATS; | ||
| 34 | - public static final Vector<BarcodeFormat> ONE_D_FORMATS; | ||
| 35 | - public static final Vector<BarcodeFormat> QR_CODE_FORMATS; | ||
| 36 | - public static final Vector<BarcodeFormat> DATA_MATRIX_FORMATS; | ||
| 37 | - | ||
| 38 | - static { | ||
| 39 | - PRODUCT_FORMATS = new Vector<BarcodeFormat>(5); | ||
| 40 | - PRODUCT_FORMATS.add(BarcodeFormat.UPC_A); | ||
| 41 | - PRODUCT_FORMATS.add(BarcodeFormat.UPC_E); | ||
| 42 | - PRODUCT_FORMATS.add(BarcodeFormat.EAN_13); | ||
| 43 | - PRODUCT_FORMATS.add(BarcodeFormat.EAN_8); | ||
| 44 | - // PRODUCT_FORMATS.add(BarcodeFormat.RSS14); | ||
| 45 | - ONE_D_FORMATS = new Vector<BarcodeFormat>(PRODUCT_FORMATS.size() + 4); | ||
| 46 | - ONE_D_FORMATS.addAll(PRODUCT_FORMATS); | ||
| 47 | - ONE_D_FORMATS.add(BarcodeFormat.CODE_39); | ||
| 48 | - ONE_D_FORMATS.add(BarcodeFormat.CODE_93); | ||
| 49 | - ONE_D_FORMATS.add(BarcodeFormat.CODE_128); | ||
| 50 | - ONE_D_FORMATS.add(BarcodeFormat.ITF); | ||
| 51 | - QR_CODE_FORMATS = new Vector<BarcodeFormat>(1); | ||
| 52 | - QR_CODE_FORMATS.add(BarcodeFormat.QR_CODE); | ||
| 53 | - DATA_MATRIX_FORMATS = new Vector<BarcodeFormat>(1); | ||
| 54 | - DATA_MATRIX_FORMATS.add(BarcodeFormat.DATA_MATRIX); | ||
| 55 | - } | ||
| 56 | - | ||
| 57 | - private DecodeFormatManager() { | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - static Vector<BarcodeFormat> parseDecodeFormats(Intent intent) { | ||
| 61 | - List<String> scanFormats = null; | ||
| 62 | - String scanFormatsString = intent.getStringExtra(Intents.Scan.SCAN_FORMATS); | ||
| 63 | - if (scanFormatsString != null) { | ||
| 64 | - scanFormats = Arrays.asList(COMMA_PATTERN.split(scanFormatsString)); | ||
| 65 | - } | ||
| 66 | - return parseDecodeFormats(scanFormats, intent.getStringExtra(Intents.Scan.MODE)); | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - static Vector<BarcodeFormat> parseDecodeFormats(Uri inputUri) { | ||
| 70 | - List<String> formats = inputUri.getQueryParameters(Intents.Scan.SCAN_FORMATS); | ||
| 71 | - if (formats != null && formats.size() == 1 && formats.get(0) != null) { | ||
| 72 | - formats = Arrays.asList(COMMA_PATTERN.split(formats.get(0))); | ||
| 73 | - } | ||
| 74 | - return parseDecodeFormats(formats, inputUri.getQueryParameter(Intents.Scan.MODE)); | ||
| 75 | - } | ||
| 76 | - | ||
| 77 | - private static Vector<BarcodeFormat> parseDecodeFormats(Iterable<String> scanFormats, | ||
| 78 | - String decodeMode) { | ||
| 79 | - if (scanFormats != null) { | ||
| 80 | - Vector<BarcodeFormat> formats = new Vector<BarcodeFormat>(); | ||
| 81 | - try { | ||
| 82 | - for (String format : scanFormats) { | ||
| 83 | - formats.add(BarcodeFormat.valueOf(format)); | ||
| 84 | - } | ||
| 85 | - return formats; | ||
| 86 | - } catch (IllegalArgumentException iae) { | ||
| 87 | - // ignore it then | ||
| 88 | - } | ||
| 89 | - } | ||
| 90 | - if (decodeMode != null) { | ||
| 91 | - if (Intents.Scan.PRODUCT_MODE.equals(decodeMode)) { | ||
| 92 | - return PRODUCT_FORMATS; | ||
| 93 | - } | ||
| 94 | - if (Intents.Scan.QR_CODE_MODE.equals(decodeMode)) { | ||
| 95 | - return QR_CODE_FORMATS; | ||
| 96 | - } | ||
| 97 | - if (Intents.Scan.DATA_MATRIX_MODE.equals(decodeMode)) { | ||
| 98 | - return DATA_MATRIX_FORMATS; | ||
| 99 | - } | ||
| 100 | - if (Intents.Scan.ONE_D_MODE.equals(decodeMode)) { | ||
| 101 | - return ONE_D_FORMATS; | ||
| 102 | - } | ||
| 103 | - } | ||
| 104 | - return null; | ||
| 105 | - } | ||
| 106 | - | ||
| 107 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/decoding/DecodeHandler.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2010 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.decoding; | ||
| 18 | - | ||
| 19 | -import android.os.Bundle; | ||
| 20 | -import android.os.Handler; | ||
| 21 | -import android.os.Looper; | ||
| 22 | -import android.os.Message; | ||
| 23 | -import android.util.Log; | ||
| 24 | - | ||
| 25 | -import com.cnlive.cloud.shanghaishop.R; | ||
| 26 | -import com.google.zxing.BinaryBitmap; | ||
| 27 | -import com.google.zxing.DecodeHintType; | ||
| 28 | -import com.google.zxing.MultiFormatReader; | ||
| 29 | -import com.google.zxing.ReaderException; | ||
| 30 | -import com.google.zxing.Result; | ||
| 31 | -import com.google.zxing.common.HybridBinarizer; | ||
| 32 | -import com.uuzuche.lib_zxing.activity.CaptureFragment; | ||
| 33 | -import com.uuzuche.lib_zxing.camera.CameraManager; | ||
| 34 | -import com.uuzuche.lib_zxing.camera.PlanarYUVLuminanceSource; | ||
| 35 | - | ||
| 36 | -import java.util.Hashtable; | ||
| 37 | - | ||
| 38 | -final class DecodeHandler extends Handler { | ||
| 39 | - | ||
| 40 | - private static final String TAG = DecodeHandler.class.getSimpleName(); | ||
| 41 | - | ||
| 42 | - private final CaptureFragment fragment; | ||
| 43 | - private final MultiFormatReader multiFormatReader; | ||
| 44 | - | ||
| 45 | - DecodeHandler(CaptureFragment fragment, Hashtable<DecodeHintType, Object> hints) { | ||
| 46 | - multiFormatReader = new MultiFormatReader(); | ||
| 47 | - multiFormatReader.setHints(hints); | ||
| 48 | - this.fragment = fragment; | ||
| 49 | - } | ||
| 50 | - | ||
| 51 | - @Override | ||
| 52 | - public void handleMessage(Message message) { | ||
| 53 | - if (message.what == R.id.decode) { | ||
| 54 | - decode((byte[]) message.obj, message.arg1, message.arg2); | ||
| 55 | - } else if (message.what == R.id.quit) { | ||
| 56 | - Looper.myLooper().quit(); | ||
| 57 | - } | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - /** | ||
| 61 | - * Decode the data within the viewfinder rectangle, and time how long it took. For efficiency, | ||
| 62 | - * reuse the same reader objects from one decode to the next. | ||
| 63 | - * | ||
| 64 | - * @param data The YUV preview frame. | ||
| 65 | - * @param width The width of the preview frame. | ||
| 66 | - * @param height The height of the preview frame. | ||
| 67 | - */ | ||
| 68 | - private void decode(byte[] data, int width, int height) { | ||
| 69 | - long start = System.currentTimeMillis(); | ||
| 70 | - Result rawResult = null; | ||
| 71 | - | ||
| 72 | - //modify here | ||
| 73 | - byte[] rotatedData = new byte[data.length]; | ||
| 74 | - for (int y = 0; y < height; y++) { | ||
| 75 | - for (int x = 0; x < width; x++) | ||
| 76 | - rotatedData[x * height + height - y - 1] = data[x + y * width]; | ||
| 77 | - } | ||
| 78 | - int tmp = width; // Here we are swapping, that's the difference to #11 | ||
| 79 | - width = height; | ||
| 80 | - height = tmp; | ||
| 81 | - | ||
| 82 | - PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height); | ||
| 83 | - BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); | ||
| 84 | - try { | ||
| 85 | - rawResult = multiFormatReader.decodeWithState(bitmap); | ||
| 86 | - } catch (ReaderException re) { | ||
| 87 | - // continue | ||
| 88 | - } finally { | ||
| 89 | - multiFormatReader.reset(); | ||
| 90 | - } | ||
| 91 | - | ||
| 92 | - if (rawResult != null) { | ||
| 93 | - long end = System.currentTimeMillis(); | ||
| 94 | - Log.d(TAG, "Found barcode (" + (end - start) + " ms):\n" + rawResult.toString()); | ||
| 95 | - Message message = Message.obtain(fragment.getHandler(), R.id.decode_succeeded, rawResult); | ||
| 96 | - Bundle bundle = new Bundle(); | ||
| 97 | - bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap()); | ||
| 98 | - message.setData(bundle); | ||
| 99 | - //Log.d(TAG, "Sending decode succeeded message..."); | ||
| 100 | - message.sendToTarget(); | ||
| 101 | - } else { | ||
| 102 | - Message message = Message.obtain(fragment.getHandler(), R.id.decode_failed); | ||
| 103 | - message.sendToTarget(); | ||
| 104 | - } | ||
| 105 | - } | ||
| 106 | - | ||
| 107 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/decoding/DecodeThread.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2008 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.decoding; | ||
| 18 | - | ||
| 19 | -import android.os.Handler; | ||
| 20 | -import android.os.Looper; | ||
| 21 | - | ||
| 22 | -import com.google.zxing.BarcodeFormat; | ||
| 23 | -import com.google.zxing.DecodeHintType; | ||
| 24 | -import com.google.zxing.ResultPointCallback; | ||
| 25 | -import com.uuzuche.lib_zxing.activity.CaptureFragment; | ||
| 26 | - | ||
| 27 | -import java.util.Hashtable; | ||
| 28 | -import java.util.Vector; | ||
| 29 | -import java.util.concurrent.CountDownLatch; | ||
| 30 | - | ||
| 31 | -/** | ||
| 32 | - * This thread does all the heavy lifting of decoding the images. | ||
| 33 | - * �����߳� | ||
| 34 | - */ | ||
| 35 | -final class DecodeThread extends Thread { | ||
| 36 | - | ||
| 37 | - public static final String BARCODE_BITMAP = "barcode_bitmap"; | ||
| 38 | - private final CaptureFragment fragment; | ||
| 39 | - private final Hashtable<DecodeHintType, Object> hints; | ||
| 40 | - private Handler handler; | ||
| 41 | - private final CountDownLatch handlerInitLatch; | ||
| 42 | - | ||
| 43 | - DecodeThread(CaptureFragment fragment, | ||
| 44 | - Vector<BarcodeFormat> decodeFormats, | ||
| 45 | - String characterSet, | ||
| 46 | - ResultPointCallback resultPointCallback) { | ||
| 47 | - | ||
| 48 | - this.fragment = fragment; | ||
| 49 | - handlerInitLatch = new CountDownLatch(1); | ||
| 50 | - | ||
| 51 | - hints = new Hashtable<DecodeHintType, Object>(3); | ||
| 52 | - | ||
| 53 | - if (decodeFormats == null || decodeFormats.isEmpty()) { | ||
| 54 | - decodeFormats = new Vector<BarcodeFormat>(); | ||
| 55 | - decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS); | ||
| 56 | - decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS); | ||
| 57 | - decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS); | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats); | ||
| 61 | - | ||
| 62 | - if (characterSet != null) { | ||
| 63 | - hints.put(DecodeHintType.CHARACTER_SET, characterSet); | ||
| 64 | - } | ||
| 65 | - | ||
| 66 | - hints.put(DecodeHintType.NEED_RESULT_POINT_CALLBACK, resultPointCallback); | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - Handler getHandler() { | ||
| 70 | - try { | ||
| 71 | - handlerInitLatch.await(); | ||
| 72 | - } catch (InterruptedException ie) { | ||
| 73 | - // continue? | ||
| 74 | - } | ||
| 75 | - return handler; | ||
| 76 | - } | ||
| 77 | - | ||
| 78 | - @Override | ||
| 79 | - public void run() { | ||
| 80 | - Looper.prepare(); | ||
| 81 | - handler = new DecodeHandler(fragment, hints); | ||
| 82 | - handlerInitLatch.countDown(); | ||
| 83 | - Looper.loop(); | ||
| 84 | - } | ||
| 85 | - | ||
| 86 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/decoding/FinishListener.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2010 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.decoding; | ||
| 18 | - | ||
| 19 | -import android.app.Activity; | ||
| 20 | -import android.content.DialogInterface; | ||
| 21 | - | ||
| 22 | -/** | ||
| 23 | - * Simple listener used to exit the app in a few cases. | ||
| 24 | - */ | ||
| 25 | -public final class FinishListener | ||
| 26 | - implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener, Runnable { | ||
| 27 | - | ||
| 28 | - private final Activity activityToFinish; | ||
| 29 | - | ||
| 30 | - public FinishListener(Activity activityToFinish) { | ||
| 31 | - this.activityToFinish = activityToFinish; | ||
| 32 | - } | ||
| 33 | - | ||
| 34 | - public void onCancel(DialogInterface dialogInterface) { | ||
| 35 | - run(); | ||
| 36 | - } | ||
| 37 | - | ||
| 38 | - public void onClick(DialogInterface dialogInterface, int i) { | ||
| 39 | - run(); | ||
| 40 | - } | ||
| 41 | - | ||
| 42 | - public void run() { | ||
| 43 | - activityToFinish.finish(); | ||
| 44 | - } | ||
| 45 | - | ||
| 46 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/decoding/InactivityTimer.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2010 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.decoding; | ||
| 18 | - | ||
| 19 | -import android.app.Activity; | ||
| 20 | - | ||
| 21 | -import java.util.concurrent.Executors; | ||
| 22 | -import java.util.concurrent.ScheduledExecutorService; | ||
| 23 | -import java.util.concurrent.ScheduledFuture; | ||
| 24 | -import java.util.concurrent.ThreadFactory; | ||
| 25 | -import java.util.concurrent.TimeUnit; | ||
| 26 | - | ||
| 27 | -/** | ||
| 28 | - * Finishes an activity after a period of inactivity. | ||
| 29 | - */ | ||
| 30 | -public final class InactivityTimer { | ||
| 31 | - | ||
| 32 | - private static final int INACTIVITY_DELAY_SECONDS = 5 * 60; | ||
| 33 | - | ||
| 34 | - private final ScheduledExecutorService inactivityTimer = | ||
| 35 | - Executors.newSingleThreadScheduledExecutor(new DaemonThreadFactory()); | ||
| 36 | - private final Activity activity; | ||
| 37 | - private ScheduledFuture<?> inactivityFuture = null; | ||
| 38 | - | ||
| 39 | - public InactivityTimer(Activity activity) { | ||
| 40 | - this.activity = activity; | ||
| 41 | - onActivity(); | ||
| 42 | - } | ||
| 43 | - | ||
| 44 | - public void onActivity() { | ||
| 45 | - cancel(); | ||
| 46 | - inactivityFuture = inactivityTimer.schedule(new FinishListener(activity), | ||
| 47 | - INACTIVITY_DELAY_SECONDS, | ||
| 48 | - TimeUnit.SECONDS); | ||
| 49 | - } | ||
| 50 | - | ||
| 51 | - private void cancel() { | ||
| 52 | - if (inactivityFuture != null) { | ||
| 53 | - inactivityFuture.cancel(true); | ||
| 54 | - inactivityFuture = null; | ||
| 55 | - } | ||
| 56 | - } | ||
| 57 | - | ||
| 58 | - public void shutdown() { | ||
| 59 | - cancel(); | ||
| 60 | - inactivityTimer.shutdown(); | ||
| 61 | - } | ||
| 62 | - | ||
| 63 | - private static final class DaemonThreadFactory implements ThreadFactory { | ||
| 64 | - public Thread newThread(Runnable runnable) { | ||
| 65 | - Thread thread = new Thread(runnable); | ||
| 66 | - thread.setDaemon(true); | ||
| 67 | - return thread; | ||
| 68 | - } | ||
| 69 | - } | ||
| 70 | - | ||
| 71 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/decoding/Intents.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2008 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.decoding; | ||
| 18 | - | ||
| 19 | -/** | ||
| 20 | - * This class provides the constants to use when sending an Intent to Barcode Scanner. | ||
| 21 | - * These strings are effectively API and cannot be changed. | ||
| 22 | - */ | ||
| 23 | -public final class Intents { | ||
| 24 | - private Intents() { | ||
| 25 | - } | ||
| 26 | - | ||
| 27 | - public static final class Scan { | ||
| 28 | - /** | ||
| 29 | - * Send this intent to open the Barcodes app in scanning mode, find a barcode, and return | ||
| 30 | - * the results. | ||
| 31 | - */ | ||
| 32 | - public static final String ACTION = "com.google.zxing.client.android.SCAN"; | ||
| 33 | - | ||
| 34 | - /** | ||
| 35 | - * By default, sending Scan.ACTION will decode all barcodes that we understand. However it | ||
| 36 | - * may be useful to limit scanning to certain formats. Use Intent.putExtra(MODE, value) with | ||
| 37 | - * one of the values below ({@link #PRODUCT_MODE}, {@link #ONE_D_MODE}, {@link #QR_CODE_MODE}). | ||
| 38 | - * Optional. | ||
| 39 | - * <p> | ||
| 40 | - * Setting this is effectively shorthnad for setting explicit formats with {@link #SCAN_FORMATS}. | ||
| 41 | - * It is overridden by that setting. | ||
| 42 | - */ | ||
| 43 | - public static final String MODE = "SCAN_MODE"; | ||
| 44 | - | ||
| 45 | - /** | ||
| 46 | - * Comma-separated list of formats to scan for. The values must match the names of | ||
| 47 | - * {@link com.google.zxing.BarcodeFormat}s, such as {@link com.google.zxing.BarcodeFormat#EAN_13}. | ||
| 48 | - * Example: "EAN_13,EAN_8,QR_CODE" | ||
| 49 | - * <p> | ||
| 50 | - * This overrides {@link #MODE}. | ||
| 51 | - */ | ||
| 52 | - public static final String SCAN_FORMATS = "SCAN_FORMATS"; | ||
| 53 | - | ||
| 54 | - /** | ||
| 55 | - * @see com.google.zxing.DecodeHintType#CHARACTER_SET | ||
| 56 | - */ | ||
| 57 | - public static final String CHARACTER_SET = "CHARACTER_SET"; | ||
| 58 | - | ||
| 59 | - /** | ||
| 60 | - * Decode only UPC and EAN barcodes. This is the right choice for shopping apps which get | ||
| 61 | - * prices, reviews, etc. for products. | ||
| 62 | - */ | ||
| 63 | - public static final String PRODUCT_MODE = "PRODUCT_MODE"; | ||
| 64 | - | ||
| 65 | - /** | ||
| 66 | - * Decode only 1D barcodes (currently UPC, EAN, Code 39, and Code 128). | ||
| 67 | - */ | ||
| 68 | - public static final String ONE_D_MODE = "ONE_D_MODE"; | ||
| 69 | - | ||
| 70 | - /** | ||
| 71 | - * Decode only QR codes. | ||
| 72 | - */ | ||
| 73 | - public static final String QR_CODE_MODE = "QR_CODE_MODE"; | ||
| 74 | - | ||
| 75 | - /** | ||
| 76 | - * Decode only Data Matrix codes. | ||
| 77 | - */ | ||
| 78 | - public static final String DATA_MATRIX_MODE = "DATA_MATRIX_MODE"; | ||
| 79 | - | ||
| 80 | - /** | ||
| 81 | - * If a barcode is found, Barcodes returns RESULT_OK to onActivityResult() of the app which | ||
| 82 | - * requested the scan via startSubActivity(). The barcodes contents can be retrieved with | ||
| 83 | - * intent.getStringExtra(RESULT). If the user presses Back, the result code will be | ||
| 84 | - * RESULT_CANCELED. | ||
| 85 | - */ | ||
| 86 | - public static final String RESULT = "SCAN_RESULT"; | ||
| 87 | - | ||
| 88 | - /** | ||
| 89 | - * Call intent.getStringExtra(RESULT_FORMAT) to determine which barcode format was found. | ||
| 90 | - * See Contents.Format for possible values. | ||
| 91 | - */ | ||
| 92 | - public static final String RESULT_FORMAT = "SCAN_RESULT_FORMAT"; | ||
| 93 | - | ||
| 94 | - /** | ||
| 95 | - * Setting this to false will not save scanned codes in the history. | ||
| 96 | - */ | ||
| 97 | - public static final String SAVE_HISTORY = "SAVE_HISTORY"; | ||
| 98 | - | ||
| 99 | - private Scan() { | ||
| 100 | - } | ||
| 101 | - } | ||
| 102 | - | ||
| 103 | - public static final class Encode { | ||
| 104 | - /** | ||
| 105 | - * Send this intent to encode a piece of data as a QR code and display it full screen, so | ||
| 106 | - * that another person can scan the barcode from your screen. | ||
| 107 | - */ | ||
| 108 | - public static final String ACTION = "com.google.zxing.client.android.ENCODE"; | ||
| 109 | - | ||
| 110 | - /** | ||
| 111 | - * The data to encode. Use Intent.putExtra(DATA, data) where data is either a String or a | ||
| 112 | - * Bundle, depending on the type and format specified. Non-QR Code formats should | ||
| 113 | - * just use a String here. For QR Code, see Contents for details. | ||
| 114 | - */ | ||
| 115 | - public static final String DATA = "ENCODE_DATA"; | ||
| 116 | - | ||
| 117 | - /** | ||
| 118 | - * The type of data being supplied if the format is QR Code. Use | ||
| 119 | - * Intent.putExtra(TYPE, type) with one of Contents.Type. | ||
| 120 | - */ | ||
| 121 | - public static final String TYPE = "ENCODE_TYPE"; | ||
| 122 | - | ||
| 123 | - /** | ||
| 124 | - * The barcode format to be displayed. If this isn't specified or is blank, | ||
| 125 | - * it defaults to QR Code. Use Intent.putExtra(FORMAT, format), where | ||
| 126 | - * format is one of Contents.Format. | ||
| 127 | - */ | ||
| 128 | - public static final String FORMAT = "ENCODE_FORMAT"; | ||
| 129 | - | ||
| 130 | - private Encode() { | ||
| 131 | - } | ||
| 132 | - } | ||
| 133 | - | ||
| 134 | - public static final class SearchBookContents { | ||
| 135 | - /** | ||
| 136 | - * Use Google Book Search to search the contents of the book provided. | ||
| 137 | - */ | ||
| 138 | - public static final String ACTION = "com.google.zxing.client.android.SEARCH_BOOK_CONTENTS"; | ||
| 139 | - | ||
| 140 | - /** | ||
| 141 | - * The book to search, identified by ISBN number. | ||
| 142 | - */ | ||
| 143 | - public static final String ISBN = "ISBN"; | ||
| 144 | - | ||
| 145 | - /** | ||
| 146 | - * An optional field which is the text to search for. | ||
| 147 | - */ | ||
| 148 | - public static final String QUERY = "QUERY"; | ||
| 149 | - | ||
| 150 | - private SearchBookContents() { | ||
| 151 | - } | ||
| 152 | - } | ||
| 153 | - | ||
| 154 | - public static final class WifiConnect { | ||
| 155 | - /** | ||
| 156 | - * Internal intent used to trigger connection to a wi-fi network. | ||
| 157 | - */ | ||
| 158 | - public static final String ACTION = "com.google.zxing.client.android.WIFI_CONNECT"; | ||
| 159 | - | ||
| 160 | - /** | ||
| 161 | - * The network to connect to, all the configuration provided here. | ||
| 162 | - */ | ||
| 163 | - public static final String SSID = "SSID"; | ||
| 164 | - | ||
| 165 | - /** | ||
| 166 | - * The network to connect to, all the configuration provided here. | ||
| 167 | - */ | ||
| 168 | - public static final String TYPE = "TYPE"; | ||
| 169 | - | ||
| 170 | - /** | ||
| 171 | - * The network to connect to, all the configuration provided here. | ||
| 172 | - */ | ||
| 173 | - public static final String PASSWORD = "PASSWORD"; | ||
| 174 | - | ||
| 175 | - private WifiConnect() { | ||
| 176 | - } | ||
| 177 | - } | ||
| 178 | - | ||
| 179 | - | ||
| 180 | - public static final class Share { | ||
| 181 | - /** | ||
| 182 | - * Give the user a choice of items to encode as a barcode, then render it as a QR Code and | ||
| 183 | - * display onscreen for a friend to scan with their phone. | ||
| 184 | - */ | ||
| 185 | - public static final String ACTION = "com.google.zxing.client.android.SHARE"; | ||
| 186 | - | ||
| 187 | - private Share() { | ||
| 188 | - } | ||
| 189 | - } | ||
| 190 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/encoding/EncodingHandler.java deleted
100644 → 0
| 1 | -package com.uuzuche.lib_zxing.encoding; | ||
| 2 | - | ||
| 3 | -import android.graphics.Bitmap; | ||
| 4 | - | ||
| 5 | -import com.google.zxing.BarcodeFormat; | ||
| 6 | -import com.google.zxing.EncodeHintType; | ||
| 7 | -import com.google.zxing.MultiFormatWriter; | ||
| 8 | -import com.google.zxing.WriterException; | ||
| 9 | -import com.google.zxing.common.BitMatrix; | ||
| 10 | - | ||
| 11 | -import java.util.Hashtable; | ||
| 12 | - | ||
| 13 | -/** | ||
| 14 | - * @author Ryan Tang | ||
| 15 | - */ | ||
| 16 | -public final class EncodingHandler { | ||
| 17 | - private static final int BLACK = 0xff000000; | ||
| 18 | - | ||
| 19 | - public static Bitmap createQRCode(String str, int widthAndHeight) throws WriterException { | ||
| 20 | - Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(); | ||
| 21 | - hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); | ||
| 22 | - BitMatrix matrix = new MultiFormatWriter().encode(str, | ||
| 23 | - BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight); | ||
| 24 | - int width = matrix.getWidth(); | ||
| 25 | - int height = matrix.getHeight(); | ||
| 26 | - int[] pixels = new int[width * height]; | ||
| 27 | - | ||
| 28 | - for (int y = 0; y < height; y++) { | ||
| 29 | - for (int x = 0; x < width; x++) { | ||
| 30 | - if (matrix.get(x, y)) { | ||
| 31 | - pixels[y * width + x] = BLACK; | ||
| 32 | - } | ||
| 33 | - } | ||
| 34 | - } | ||
| 35 | - Bitmap bitmap = Bitmap.createBitmap(width, height, | ||
| 36 | - Bitmap.Config.ARGB_8888); | ||
| 37 | - bitmap.setPixels(pixels, 0, width, 0, 0, width, height); | ||
| 38 | - return bitmap; | ||
| 39 | - } | ||
| 40 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/view/ViewfinderResultPointCallback.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2009 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.view; | ||
| 18 | - | ||
| 19 | -import com.google.zxing.ResultPoint; | ||
| 20 | -import com.google.zxing.ResultPointCallback; | ||
| 21 | - | ||
| 22 | -public final class ViewfinderResultPointCallback implements ResultPointCallback { | ||
| 23 | - | ||
| 24 | - private final ViewfinderView viewfinderView; | ||
| 25 | - | ||
| 26 | - public ViewfinderResultPointCallback(ViewfinderView viewfinderView) { | ||
| 27 | - this.viewfinderView = viewfinderView; | ||
| 28 | - } | ||
| 29 | - | ||
| 30 | - public void foundPossibleResultPoint(ResultPoint point) { | ||
| 31 | - viewfinderView.addPossibleResultPoint(point); | ||
| 32 | - } | ||
| 33 | - | ||
| 34 | -} |
module/shanghaishop/src/main/java/com/uuzuche/lib_zxing/view/ViewfinderView.java deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * Copyright (C) 2008 ZXing authors | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -package com.uuzuche.lib_zxing.view; | ||
| 18 | - | ||
| 19 | -import android.content.Context; | ||
| 20 | -import android.content.res.Resources; | ||
| 21 | -import android.content.res.TypedArray; | ||
| 22 | -import android.graphics.Bitmap; | ||
| 23 | -import android.graphics.BitmapFactory; | ||
| 24 | -import android.graphics.Canvas; | ||
| 25 | -import android.graphics.Color; | ||
| 26 | -import android.graphics.Paint; | ||
| 27 | -import android.graphics.Rect; | ||
| 28 | -import android.graphics.drawable.Drawable; | ||
| 29 | -import android.util.AttributeSet; | ||
| 30 | -import android.view.View; | ||
| 31 | - | ||
| 32 | -import com.cnlive.cloud.shanghaishop.R; | ||
| 33 | -import com.google.zxing.ResultPoint; | ||
| 34 | -import com.uuzuche.lib_zxing.DisplayUtil; | ||
| 35 | -import com.uuzuche.lib_zxing.camera.CameraManager; | ||
| 36 | - | ||
| 37 | -import java.util.Collection; | ||
| 38 | -import java.util.HashSet; | ||
| 39 | - | ||
| 40 | -/** | ||
| 41 | - * 自定义组件实现,扫描功能 | ||
| 42 | - */ | ||
| 43 | -public final class ViewfinderView extends View { | ||
| 44 | - | ||
| 45 | - private static final long ANIMATION_DELAY = 100L; | ||
| 46 | - private static final int OPAQUE = 0xFF; | ||
| 47 | - | ||
| 48 | - private final Paint paint; | ||
| 49 | - private Bitmap resultBitmap; | ||
| 50 | - private final int maskColor; | ||
| 51 | - private final int resultColor; | ||
| 52 | - private final int resultPointColor; | ||
| 53 | - private Collection<ResultPoint> possibleResultPoints; | ||
| 54 | - private Collection<ResultPoint> lastPossibleResultPoints; | ||
| 55 | - | ||
| 56 | - public ViewfinderView(Context context) { | ||
| 57 | - this(context, null); | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - public ViewfinderView(Context context, AttributeSet attrs) { | ||
| 61 | - this(context, attrs, -1); | ||
| 62 | - | ||
| 63 | - } | ||
| 64 | - | ||
| 65 | - public ViewfinderView(Context context, AttributeSet attrs, int defStyleAttr) { | ||
| 66 | - super(context, attrs, defStyleAttr); | ||
| 67 | - paint = new Paint(); | ||
| 68 | - Resources resources = getResources(); | ||
| 69 | - maskColor = resources.getColor(R.color.viewfinder_mask); | ||
| 70 | - resultColor = resources.getColor(R.color.result_view); | ||
| 71 | - resultPointColor = resources.getColor(R.color.possible_result_points); | ||
| 72 | - possibleResultPoints = new HashSet<>(5); | ||
| 73 | - | ||
| 74 | - scanLight = BitmapFactory.decodeResource(resources, | ||
| 75 | - R.drawable.scan_light); | ||
| 76 | - | ||
| 77 | - initInnerRect(context, attrs); | ||
| 78 | - } | ||
| 79 | - | ||
| 80 | - /** | ||
| 81 | - * 初始化内部框的大小 | ||
| 82 | - * | ||
| 83 | - * @param context | ||
| 84 | - * @param attrs | ||
| 85 | - */ | ||
| 86 | - private void initInnerRect(Context context, AttributeSet attrs) { | ||
| 87 | - TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ViewfinderView); | ||
| 88 | - | ||
| 89 | - // 扫描框距离顶部 | ||
| 90 | - float innerMarginTop = ta.getDimension(R.styleable.ViewfinderView_inner_margintop, -1); | ||
| 91 | - if (innerMarginTop != -1) { | ||
| 92 | - CameraManager.FRAME_MARGINTOP = (int) innerMarginTop; | ||
| 93 | - } | ||
| 94 | - | ||
| 95 | - // 扫描框的宽度 | ||
| 96 | - CameraManager.FRAME_WIDTH = (int) ta.getDimension(R.styleable.ViewfinderView_inner_width, DisplayUtil.screenWidthPx / 2); | ||
| 97 | - | ||
| 98 | - // 扫描框的高度 | ||
| 99 | - CameraManager.FRAME_HEIGHT = (int) ta.getDimension(R.styleable.ViewfinderView_inner_height, DisplayUtil.screenWidthPx / 2); | ||
| 100 | - | ||
| 101 | - // 扫描框边角颜色 | ||
| 102 | - innercornercolor = ta.getColor(R.styleable.ViewfinderView_inner_corner_color, Color.parseColor("#45DDDD")); | ||
| 103 | - // 扫描框边角长度 | ||
| 104 | - innercornerlength = (int) ta.getDimension(R.styleable.ViewfinderView_inner_corner_length, 65); | ||
| 105 | - // 扫描框边角宽度 | ||
| 106 | - innercornerwidth = (int) ta.getDimension(R.styleable.ViewfinderView_inner_corner_width, 15); | ||
| 107 | - | ||
| 108 | - // 扫描bitmap | ||
| 109 | - Drawable drawable = ta.getDrawable(R.styleable.ViewfinderView_inner_scan_bitmap); | ||
| 110 | - if (drawable != null) { | ||
| 111 | - } | ||
| 112 | - | ||
| 113 | - // 扫描控件 | ||
| 114 | - scanLight = BitmapFactory.decodeResource(getResources(), ta.getResourceId(R.styleable.ViewfinderView_inner_scan_bitmap, R.drawable.scan_light)); | ||
| 115 | - // 扫描速度 | ||
| 116 | - SCAN_VELOCITY = ta.getInt(R.styleable.ViewfinderView_inner_scan_speed, 5); | ||
| 117 | - | ||
| 118 | - isCircle = ta.getBoolean(R.styleable.ViewfinderView_inner_scan_iscircle, true); | ||
| 119 | - | ||
| 120 | - ta.recycle(); | ||
| 121 | - } | ||
| 122 | - | ||
| 123 | - @Override | ||
| 124 | - public void onDraw(Canvas canvas) { | ||
| 125 | - Rect frame = CameraManager.get().getFramingRect(); | ||
| 126 | - if (frame == null) { | ||
| 127 | - return; | ||
| 128 | - } | ||
| 129 | - int width = canvas.getWidth(); | ||
| 130 | - int height = canvas.getHeight(); | ||
| 131 | - | ||
| 132 | - // Draw the exterior (i.e. outside the framing rect) darkened | ||
| 133 | - paint.setColor(resultBitmap != null ? resultColor : maskColor); | ||
| 134 | - canvas.drawRect(0, 0, width, frame.top, paint); | ||
| 135 | - canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint); | ||
| 136 | - canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint); | ||
| 137 | - canvas.drawRect(0, frame.bottom + 1, width, height, paint); | ||
| 138 | - | ||
| 139 | - if (resultBitmap != null) { | ||
| 140 | - // Draw the opaque result bitmap over the scanning rectangle | ||
| 141 | - paint.setAlpha(OPAQUE); | ||
| 142 | - canvas.drawBitmap(resultBitmap, frame.left, frame.top, paint); | ||
| 143 | - } else { | ||
| 144 | - | ||
| 145 | - drawFrameBounds(canvas, frame); | ||
| 146 | - | ||
| 147 | - drawScanLight(canvas, frame); | ||
| 148 | - | ||
| 149 | - Collection<ResultPoint> currentPossible = possibleResultPoints; | ||
| 150 | - Collection<ResultPoint> currentLast = lastPossibleResultPoints; | ||
| 151 | - if (currentPossible.isEmpty()) { | ||
| 152 | - lastPossibleResultPoints = null; | ||
| 153 | - } else { | ||
| 154 | - possibleResultPoints = new HashSet<ResultPoint>(5); | ||
| 155 | - lastPossibleResultPoints = currentPossible; | ||
| 156 | - paint.setAlpha(OPAQUE); | ||
| 157 | - paint.setColor(resultPointColor); | ||
| 158 | - | ||
| 159 | - if (isCircle) { | ||
| 160 | - for (ResultPoint point : currentPossible) { | ||
| 161 | - canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 6.0f, paint); | ||
| 162 | - } | ||
| 163 | - } | ||
| 164 | - } | ||
| 165 | - if (currentLast != null) { | ||
| 166 | - paint.setAlpha(OPAQUE / 2); | ||
| 167 | - paint.setColor(resultPointColor); | ||
| 168 | - | ||
| 169 | - if (isCircle) { | ||
| 170 | - for (ResultPoint point : currentLast) { | ||
| 171 | - canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 3.0f, paint); | ||
| 172 | - } | ||
| 173 | - } | ||
| 174 | - } | ||
| 175 | - | ||
| 176 | - postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top, frame.right, frame.bottom); | ||
| 177 | - } | ||
| 178 | - } | ||
| 179 | - | ||
| 180 | - // 扫描线移动的y | ||
| 181 | - private int scanLineTop; | ||
| 182 | - // 扫描线移动速度 | ||
| 183 | - private int SCAN_VELOCITY; | ||
| 184 | - // 扫描线 | ||
| 185 | - private Bitmap scanLight; | ||
| 186 | - // 是否展示小圆点 | ||
| 187 | - private boolean isCircle; | ||
| 188 | - | ||
| 189 | - /** | ||
| 190 | - * 绘制移动扫描线 | ||
| 191 | - * | ||
| 192 | - * @param canvas | ||
| 193 | - * @param frame | ||
| 194 | - */ | ||
| 195 | - private void drawScanLight(Canvas canvas, Rect frame) { | ||
| 196 | - | ||
| 197 | - if (scanLineTop == 0) { | ||
| 198 | - scanLineTop = frame.top; | ||
| 199 | - } | ||
| 200 | - | ||
| 201 | - if (scanLineTop >= frame.bottom - 30) { | ||
| 202 | - scanLineTop = frame.top; | ||
| 203 | - } else { | ||
| 204 | - scanLineTop += SCAN_VELOCITY; | ||
| 205 | - } | ||
| 206 | - Rect scanRect = new Rect(frame.left, scanLineTop, frame.right, | ||
| 207 | - scanLineTop + 30); | ||
| 208 | - canvas.drawBitmap(scanLight, null, scanRect, paint); | ||
| 209 | - } | ||
| 210 | - | ||
| 211 | - | ||
| 212 | - // 扫描框边角颜色 | ||
| 213 | - private int innercornercolor; | ||
| 214 | - // 扫描框边角长度 | ||
| 215 | - private int innercornerlength; | ||
| 216 | - // 扫描框边角宽度 | ||
| 217 | - private int innercornerwidth; | ||
| 218 | - | ||
| 219 | - /** | ||
| 220 | - * 绘制取景框边框 | ||
| 221 | - * | ||
| 222 | - * @param canvas | ||
| 223 | - * @param frame | ||
| 224 | - */ | ||
| 225 | - private void drawFrameBounds(Canvas canvas, Rect frame) { | ||
| 226 | - | ||
| 227 | - /*paint.setColor(Color.WHITE); | ||
| 228 | - paint.setStrokeWidth(2); | ||
| 229 | - paint.setStyle(Paint.Style.STROKE); | ||
| 230 | - | ||
| 231 | - canvas.drawRect(frame, paint);*/ | ||
| 232 | - | ||
| 233 | - paint.setColor(innercornercolor); | ||
| 234 | - paint.setStyle(Paint.Style.FILL); | ||
| 235 | - | ||
| 236 | - int corWidth = innercornerwidth; | ||
| 237 | - int corLength = innercornerlength; | ||
| 238 | - | ||
| 239 | - // 左上角 | ||
| 240 | - canvas.drawRect(frame.left, frame.top, frame.left + corWidth, frame.top | ||
| 241 | - + corLength, paint); | ||
| 242 | - canvas.drawRect(frame.left, frame.top, frame.left | ||
| 243 | - + corLength, frame.top + corWidth, paint); | ||
| 244 | - // 右上角 | ||
| 245 | - canvas.drawRect(frame.right - corWidth, frame.top, frame.right, | ||
| 246 | - frame.top + corLength, paint); | ||
| 247 | - canvas.drawRect(frame.right - corLength, frame.top, | ||
| 248 | - frame.right, frame.top + corWidth, paint); | ||
| 249 | - // 左下角 | ||
| 250 | - canvas.drawRect(frame.left, frame.bottom - corLength, | ||
| 251 | - frame.left + corWidth, frame.bottom, paint); | ||
| 252 | - canvas.drawRect(frame.left, frame.bottom - corWidth, frame.left | ||
| 253 | - + corLength, frame.bottom, paint); | ||
| 254 | - // 右下角 | ||
| 255 | - canvas.drawRect(frame.right - corWidth, frame.bottom - corLength, | ||
| 256 | - frame.right, frame.bottom, paint); | ||
| 257 | - canvas.drawRect(frame.right - corLength, frame.bottom - corWidth, | ||
| 258 | - frame.right, frame.bottom, paint); | ||
| 259 | - } | ||
| 260 | - | ||
| 261 | - | ||
| 262 | - public void drawViewfinder() { | ||
| 263 | - resultBitmap = null; | ||
| 264 | - invalidate(); | ||
| 265 | - } | ||
| 266 | - | ||
| 267 | - public void addPossibleResultPoint(ResultPoint point) { | ||
| 268 | - possibleResultPoints.add(point); | ||
| 269 | - } | ||
| 270 | - | ||
| 271 | - | ||
| 272 | - /** | ||
| 273 | - * 根据手机的分辨率从 dp 的单位 转成为 px(像素) | ||
| 274 | - */ | ||
| 275 | - public static int dip2px(Context context, float dpValue) { | ||
| 276 | - final float scale = context.getResources().getDisplayMetrics().density; | ||
| 277 | - return (int) (dpValue * scale + 0.5f); | ||
| 278 | - } | ||
| 279 | - | ||
| 280 | - | ||
| 281 | -} |