Підключаємо ККМ АТОЛ до AndroidStudio (оновлення до ФЗ-54)

Добрий день, Хабр. Минулого літа, мені необхідно було підключити ККМ АТОЛ, до проекту в AndroidStudio. Успішно впоравшись з поставленим завданням, я опублікував пост на Хабре, щоб полегшити шлях тим, хто піде моїм шляхом: Підключаємо ККМ АТОЛ до AndroidStudio.

У світлі оновлення законодавства (ФЗ-54), для ККМ АТОЛ були випущені оновлені драйвера, які для підключення вимагають дещо іншого підходу, ніж описаний раніше.



Під катом ви побачите, що саме я зробив. Але відразу скажу, що профі Android-розробки, нічого цікавого для себе, напевно не знайдуть, а для новачків типу мене — трохи полегшить шлях розробки.

Для підключення оновлених драйверів, були зроблені наступні кроки:

1) Видалив старий модуль з проекту: File — Project Structure — вибираємо старий модуль з розділу Modules, і натискаємо на червоний мінус;
2) Додав новий модуль: File — New — Import Module — шукаємо папку (наданої папці, у мене: Драйверы_торгового_оборудования/android/jar) FptrLibRes і додаємо її в проект;
3) Далі, як і в попередній статті додаємо в jniLibs (шлях: app/src/main), папки armeabi і armeabi-v7a;
4) Додаємо в папку libs (шлях: app/src/main) — jar-файли: fptrlib.jar, fptrproxylib.jar, paycardlib.jar, usblib.jar Правою кнопкою миші клацніть по jar-файлів і виберіть «Add As Library»;
5) Вносимо зміни в gradle (наводжу приклад з тестового проекту, який був створений ще минулого статті):

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile project(':fptrRes')
compile files('src/main/libs/fptrproxylib.jar')
compile files('src/main/libs/paycardlib.jar')
compile files('src/main/libs/usblib.jar')
compile files('src/main/libs/fptrlib.jar')
}

6) З маніфесту видаляємо рядка (якщо вони були, як в минулому тестовому проекті):

<activity android:name="com.atol.drivers.fptr.settings.SettingsActivity"
android:label="Властивості ККМ"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
</intent-filter>
</activity>
<activity android:name="com.atol.drivers.fptr.settings.DeviceListActivity"
android:configChanges="orientation|keyboardHidden"
android:label="Вибір пристрою"/>

7) У коді з'являться помилки. Для виправлення змінюємо:

fptr = new IFptr();
на
fptr = new Fptr();

Також видасть помилку на оператори містять слова «Reciept». Їх потрібно поміняти на «Receipt».

Приклад тестового додатки:

Файл AndroidManifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.kkm_test">
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>


Файл gradle
apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
applicationId "ru.kkm_test"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile project(':fptrRes')
compile files('src/main/libs/fptrproxylib.jar')
compile files('src/main/libs/paycardlib.jar')
compile files('src/main/libs/usblib.jar')
compile files('src/main/libs/fptrlib.jar')
}


Файл MainActivity
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.atol.drivers.fptr.Fptr;
import com.atol.drivers.fptr.IFptr;
import com.atol.drivers.fptr.settings.SettingsActivity;
public class MainActivity extends AppCompatActivity {
IFptr fptr = null;
public String TAG = "atol";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R. layout.activity_main);
try{
fptr = new Fptr();
fptr.create(this);
} catch (NullPointerException ex){
fptr = null;
}
}

public void onClick(View view){
switch (view.getId()){
case R. id.button:
Intent intent = new Intent(this, SettingsActivity.class);
intent.putExtra(SettingsActivity.DEVICE_SETTINGS, fptr.get_DeviceSettings());
startActivityForResult(intent, 1);

break;
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1){
if(data!=null && data.getExtras()!=null){
String settings = data.getExtras().getString(SettingsActivity.DEVICE_SETTINGS);
Toast.makeText(this, settings, Toast.LENGTH_LONG).show();
printSlip(settings);

}
}
}

@Override
protected void onDestroy() {
super.onDestroy();
fptr.destroy();
}

public void printSlip(String settings){
if(fptr == null) {
try {
fptr = new Fptr();
fptr.create(this);

} catch (NullPointerException ex) {
fptr = null;
}
}
fptr.put_DeviceSettings(settings);
fptr.put_DeviceEnabled(true);
fptr.Beep();

Log.d(TAG, fptr.GetStatus()+" status");

fptr.put_UserPassword("30");
fptr.put_Mode(1);

if(fptr.SetMode()<0){
Log.d(TAG, "Помилка: "+ fptr.get_ResultCode());
}

fptr.BeginDocument();
fptr.put_Caption("ТЕСТ.ТЕСТ.ТЕСТ.");
fptr.put_ReceiptLinespacing(255);
fptr.put_ReceiptBrightness(15);
fptr.put_Alignment(2);
fptr.PrintString();
fptr.EndDocument();

fptr.put_Mode(2);
fptr.SetMode();
fptr.PrintFooter();
}
}


Далі працюємо з офіційного керівництва.

Отже дозвольте відкланятися. Сподіваюся комусь це дозволить зберегти час і нерви. Якщо у когось є зауваження і подсказказки, з великим задоволенням їх вислухаю.

P. S.: нещодавно дісталася можливість потестувати свій додаток на пристрої з API23. При створенні і читанні файлу, постійно ловив виняток. Так я зіткнувся з новою політикою безпеки щодо дозволів. Розібратися в цьому мені допомогла чудова стаття від OneeL: Чоловічий runtime permissions. Чому, навіщо і як.

Прикинувши, що можливості API23, в моєму додатку начебто поки ні до чого, я знизив targetSdkVersion до 22. В цьому випадку все почало працювати нормально.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.