├── 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 |