├── AnprReader
├── .gitignore
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── sdtoolkit
│ │ │ └── anprreader
│ │ │ └── MainActivity.java
│ │ └── res
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ └── ic_launcher_background.xml
│ │ ├── layout-land
│ │ └── activity_main.xml
│ │ ├── layout
│ │ └── activity_main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
├── build.gradle
├── gradle.properties
└── settings.gradle
└── README.md
/AnprReader/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 |
--------------------------------------------------------------------------------
/AnprReader/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/AnprReader/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 31
5 | defaultConfig {
6 | applicationId "com.sdtoolkit.anprreader"
7 | minSdkVersion 22
8 | targetSdkVersion 31
9 | versionCode 201029
10 | versionName "2.1.29"
11 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
17 | }
18 | }
19 | buildToolsVersion '29.0.2'
20 | }
21 |
22 | dependencies {
23 | implementation 'com.sd-toolkit.developer:anpr-sdk:2.1.29'
24 | implementation fileTree(dir: 'libs', include: ['*.jar'])
25 | implementation 'androidx.appcompat:appcompat:1.0.0'
26 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
27 | }
28 |
--------------------------------------------------------------------------------
/AnprReader/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/java/com/sdtoolkit/anprreader/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.sdtoolkit.anprreader;
2 |
3 | import android.content.ComponentName;
4 | import android.content.DialogInterface;
5 | import android.content.Intent;
6 | import android.content.pm.ApplicationInfo;
7 | import android.content.pm.PackageManager;
8 | import android.graphics.Bitmap;
9 | import android.net.Uri;
10 | import androidx.annotation.NonNull;
11 | import androidx.core.app.ActivityCompat;
12 | import androidx.appcompat.app.AlertDialog;
13 | import androidx.appcompat.app.AppCompatActivity;
14 | import android.os.Bundle;
15 | import android.view.View;
16 | import android.widget.Button;
17 | import android.widget.Switch;
18 | import android.widget.TextView;
19 | import android.widget.Toast;
20 |
21 | import com.sdtoolkit.anpr.api.AnprEngineFactory;
22 | import com.sdtoolkit.anpr.api.AnprErrors;
23 | import com.sdtoolkit.anpr.api.AnprResult;
24 | import com.sdtoolkit.anpr.api.DeviceParams;
25 | import com.sdtoolkit.anpr.api.IAnprEngine;
26 | import com.sdtoolkit.anpr.api.IAnprEngineListener;
27 | import com.sdtoolkit.anpr.api.RecognitionParams;
28 | import com.sdtoolkit.anpr.view.CameraView;
29 |
30 | import java.util.ArrayList;
31 |
32 | public class MainActivity extends AppCompatActivity {
33 | private final int REQUEST_ALL_PERMISSIONS = 0x4562;
34 | private final int REQUEST_INSTALL_SDTANPR = 0x4563;
35 | private final int REQUEST_CONFIGURE_SDTANPR = 0x4563;
36 |
37 | private Button mButStart;
38 | private Button mButStop;
39 | private Button mButConfigure;
40 | private TextView mTextResults;
41 | private Switch mSwitchShowLowConfidence;
42 | private CameraView mCameraView;
43 |
44 | private IAnprEngine mAnprEngine;
45 | private DeviceParams mDeviceParams = new DeviceParams();
46 | private RecognitionParams mRecognitionParams = new RecognitionParams();
47 |
48 | private IAnprEngineListener mAnprEngineListener = new IAnprEngineListener() {
49 | @Override
50 | public void onAnprOpened(int result,
51 | DeviceParams currentDeviceParams,
52 | RecognitionParams currentRecognitionParams) {
53 | // Recognition parameters currently set in the ANPR Service
54 | // This application does not modify any parameters and just update local copy
55 | if (result != AnprErrors.SUCCESS) {
56 | return;
57 | }
58 |
59 | mDeviceParams.copyFrom(currentDeviceParams);
60 | mRecognitionParams.copyFrom(currentRecognitionParams);
61 |
62 | if (!mAnprEngine.isRecognitionRunning()) {
63 | mAnprEngine.setup(mDeviceParams);
64 | }
65 | }
66 |
67 | @Override
68 | public void onAnprClosed(int result) {
69 |
70 | }
71 |
72 | @Override
73 | public void onAnprSetupComplete(int result, DeviceParams currentDeviceParams) {
74 |
75 | }
76 |
77 | @Override
78 | public void onAnprStarted(int result) {
79 |
80 | }
81 |
82 | @Override
83 | public void onAnprStopped(int result) {
84 |
85 | }
86 |
87 | @Override
88 | public void onAnprResult(int status, AnprResult[] results, Bitmap resultFrame) {
89 | if (status == AnprErrors.SUCCESS) {
90 | populateRecognitionResults(results, resultFrame);
91 | }
92 | }
93 |
94 | @Override
95 | public void onAnprSettingsChanged(DeviceParams currentDeviceParams,
96 | RecognitionParams currentRecognitionParams) {
97 | mDeviceParams.copyFrom(currentDeviceParams);
98 | mRecognitionParams.copyFrom(currentRecognitionParams);
99 | }
100 | };
101 |
102 | @Override
103 | protected void onCreate(Bundle savedInstanceState) {
104 | super.onCreate(savedInstanceState);
105 | setContentView(R.layout.activity_main);
106 |
107 | String[] permissions = retrieveNotGrantedPermissions();
108 |
109 | if (permissions != null && permissions.length > 0) {
110 | ActivityCompat.requestPermissions(this, permissions, REQUEST_ALL_PERMISSIONS);
111 | }
112 |
113 | if (!isAnprServiceIsInstalled()) {
114 |
115 | AlertDialog.Builder builder = new AlertDialog.Builder(this);
116 | builder.setMessage("Unable to find SD-TOOLKIT ANPR Serivce");
117 | builder.setCancelable(false);
118 | builder.setPositiveButton("Install", new DialogInterface.OnClickListener() {
119 |
120 | @Override
121 | public void onClick(DialogInterface dialog, int which) {
122 | Intent intent = new Intent(Intent.ACTION_VIEW,
123 | Uri.parse("market://details?id=com.sdtoolkit.anprservice"));
124 | startActivityForResult(intent, REQUEST_INSTALL_SDTANPR);
125 | }
126 | });
127 | AlertDialog dialog = builder.create();
128 | dialog.show();
129 |
130 | }
131 |
132 | mCameraView = findViewById(R.id.preview_wnd);
133 |
134 | mButStart = findViewById(R.id.but_start);
135 | mButStart.setOnClickListener(new View.OnClickListener() {
136 | @Override
137 | public void onClick(View v) {
138 | onAnprEngineStart();
139 | }
140 | });
141 |
142 | mButStop = findViewById(R.id.but_stop);
143 | mButStop.setOnClickListener(new View.OnClickListener() {
144 | @Override
145 | public void onClick(View v) {
146 | onAnprEngineStop();
147 | }
148 | });
149 |
150 | mButConfigure = findViewById(R.id.but_configure);
151 | mButConfigure.setOnClickListener(new View.OnClickListener() {
152 | @Override
153 | public void onClick(View v) {
154 | onAnprEngineConfigure();
155 | }
156 | });
157 |
158 | mTextResults = findViewById(R.id.text_results);
159 | mSwitchShowLowConfidence = findViewById(R.id.switch_show_low_confidence);
160 |
161 | // Create Anpr Engine instance
162 | mAnprEngine = AnprEngineFactory.createAnprEngine(this);
163 |
164 | // Create intent to be used when user clicks system notification bar icon
165 | Intent runIntent = new Intent(this, this.getClass());
166 | runIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
167 | | Intent.FLAG_ACTIVITY_SINGLE_TOP);
168 |
169 | mAnprEngine.open(mAnprEngineListener, runIntent);
170 |
171 | }
172 |
173 | @Override
174 | protected void onDestroy() {
175 | super.onDestroy();
176 | if (mAnprEngine != null) {
177 | mAnprEngine.close();
178 | mAnprEngine = null;
179 | }
180 | }
181 |
182 | @Override
183 | protected void onActivityResult(int requestCode, int resultCode, Intent data) {
184 | if (requestCode == REQUEST_INSTALL_SDTANPR) {
185 | recreate();
186 | }
187 | }
188 |
189 | @Override
190 | public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
191 | @NonNull int[] grantResults) {
192 | if (requestCode == REQUEST_ALL_PERMISSIONS) {
193 | for(int gC = 0; gC < grantResults.length; gC++) {
194 | if (grantResults[gC] != PackageManager.PERMISSION_GRANTED) {
195 | // Notify User that not all permissions are granted
196 | Toast.makeText(this,
197 | "Not all permissions has been granted. Quitting...",
198 | Toast.LENGTH_LONG).show();
199 | finish();
200 | }
201 | }
202 |
203 | recreate();
204 | }
205 | }
206 |
207 | private String[] retrieveNotGrantedPermissions() {
208 | ArrayList nonGrantedPerms = new ArrayList<>();
209 | try {
210 | String[] manifestPerms = getPackageManager()
211 | .getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS)
212 | .requestedPermissions;
213 | if (manifestPerms == null || manifestPerms.length == 0) {
214 | return null;
215 | }
216 |
217 | for (String permName : manifestPerms) {
218 | int permission = ActivityCompat.checkSelfPermission(this, permName);
219 | if (permission != PackageManager.PERMISSION_GRANTED) {
220 | nonGrantedPerms.add(permName);
221 | }
222 | }
223 | } catch (PackageManager.NameNotFoundException e) {
224 | e.printStackTrace();
225 | }
226 |
227 | return nonGrantedPerms.toArray(new String[nonGrantedPerms.size()]);
228 | }
229 |
230 | private boolean isAnprServiceIsInstalled() {
231 | try {
232 | ApplicationInfo info = getPackageManager().getApplicationInfo(
233 | "com.sdtoolkit.anprservice", 0);
234 |
235 | if (info != null && info.enabled) {
236 | return true;
237 | }
238 | } catch (PackageManager.NameNotFoundException e) {
239 | e.printStackTrace();
240 | }
241 | return false;
242 | }
243 |
244 | private void onAnprEngineStart() {
245 | if (mAnprEngine != null) {
246 | mAnprEngine.beginRecognition(mRecognitionParams);
247 | }
248 | }
249 |
250 | private void onAnprEngineStop() {
251 | if (mAnprEngine != null) {
252 | mAnprEngine.endRecognition();
253 | }
254 | }
255 |
256 | private void onAnprEngineConfigure() {
257 | // Call SDT Anpr service property here
258 | Intent intent = new Intent();
259 | intent.setComponent(new ComponentName("com.sdtoolkit.anprservice",
260 | "com.sdtoolkit.anpr.activity.AnprSettingsActivity"));
261 | startActivityForResult(intent, REQUEST_CONFIGURE_SDTANPR);
262 | }
263 |
264 | private void populateRecognitionResults(final AnprResult[] results, final Bitmap resultsFrame) {
265 | if (results == null || results.length == 0) {
266 | return;
267 | }
268 |
269 | this.runOnUiThread(new Runnable() {
270 | @Override
271 | public void run() {
272 | for (AnprResult result : results) {
273 | if (mSwitchShowLowConfidence == null || mSwitchShowLowConfidence.isChecked()) {
274 | // Insert in front
275 | String newResults = String.format("%s [%s] (%.3f)\r\n",
276 | result.getPlate(), result.getCountry(), result.getConfidence());
277 | mTextResults.setText(newResults + mTextResults.getText());
278 | }
279 | }
280 | }
281 | });
282 | }
283 | }
284 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/layout-land/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
19 |
20 |
26 |
27 |
31 |
36 |
37 |
38 |
39 |
40 |
45 |
46 |
52 |
53 |
59 |
60 |
66 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
19 |
20 |
26 |
27 |
33 |
34 |
40 |
41 |
42 |
48 |
52 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sd-toolkit/android-anpr-reader/3ee5051cfff3e695c582e4304e665f7934a8644d/AnprReader/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sd-toolkit/android-anpr-reader/3ee5051cfff3e695c582e4304e665f7934a8644d/AnprReader/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sd-toolkit/android-anpr-reader/3ee5051cfff3e695c582e4304e665f7934a8644d/AnprReader/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sd-toolkit/android-anpr-reader/3ee5051cfff3e695c582e4304e665f7934a8644d/AnprReader/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sd-toolkit/android-anpr-reader/3ee5051cfff3e695c582e4304e665f7934a8644d/AnprReader/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sd-toolkit/android-anpr-reader/3ee5051cfff3e695c582e4304e665f7934a8644d/AnprReader/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sd-toolkit/android-anpr-reader/3ee5051cfff3e695c582e4304e665f7934a8644d/AnprReader/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sd-toolkit/android-anpr-reader/3ee5051cfff3e695c582e4304e665f7934a8644d/AnprReader/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sd-toolkit/android-anpr-reader/3ee5051cfff3e695c582e4304e665f7934a8644d/AnprReader/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sd-toolkit/android-anpr-reader/3ee5051cfff3e695c582e4304e665f7934a8644d/AnprReader/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Anpr Reader
3 | Start
4 | Stop
5 | Configure
6 | Show Low Confidence results (< 0.8)
7 |
8 |
--------------------------------------------------------------------------------
/AnprReader/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/AnprReader/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 |
5 | repositories {
6 | google()
7 | jcenter()
8 | }
9 | dependencies {
10 | classpath 'com.android.tools.build:gradle:4.1.0'
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | maven {
19 | url 'https://www.sd-toolkit.com/repository'
20 | }
21 | }
22 | }
23 |
24 | task clean(type: Delete) {
25 | delete rootProject.buildDir
26 | }
27 |
--------------------------------------------------------------------------------
/AnprReader/gradle.properties:
--------------------------------------------------------------------------------
1 | android.enableJetifier=true
2 | android.useAndroidX=true
--------------------------------------------------------------------------------
/AnprReader/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ANPR Reader for Android
2 |
3 | The Aronym ANPR is formed from term "Automatic Number Plate Recognition". Another name of this technology is "License Plate Recognition" (LPR).
4 | This project contains sources of the application which reads vehicle license plate from android camera device video stream or high resolution jpeg image.
5 |
6 | The diagram below demonstrates SDK components accessed by SD-TOOLKIT ANPR SDK.
7 |
8 | 
9 |
--------------------------------------------------------------------------------