Подключаем ККМ АТОЛ к AndroidStudio

    Добрый день, Хабр.
    Недавно возникла необходимость подцепить ККМ АТОЛ, в проект, разрабатываемый в Android Studio. Основная сложность состоит в том, что в официальном мануале расписано, как подключаться только в Eclipse.



    Поиск по сети натолкнул на полезный совет.
    Cоздайте папки jniLibs и libs по пути: app/src/main, как на скриншоте ниже:



    В jniLibs, создайте папку armeabi, и в неё поместите .so — файлы. В libs — jar-файл. Правой кнопкой мыши щелкните по jar-файлу, и выберите «Add As Library».

    Далее выберите File — New — Import Module, и найдите папку с проектом (FptrLibRes). Добавьте её в проект. В app.gradle — добавьте нижеприведенный текст(должно добавиться автоматом, но на всякий случай):

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


    Внесите изменения в основной манифест:

    Файл AndroidManifest
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="ru.kkm">
        <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>
            <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="Выбор устройства"/>
        </application>
    </manifest>
    


    Теперь создадим тестовое приложение, которое позволяет получить доступ к стандартной странице настроек:

    Тестовый код
    package ru.kkm;
    
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Toast;
    
    import com.atol.drivers.fptr.IFptr;
    import com.atol.drivers.fptr.settings.SettingsActivity;
    
    public class MainActivity extends AppCompatActivity {
        IFptr fptr = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            try{
                fptr = new IFptr();
                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();
    
                }
            }
        }
    }
    


    Разметка экрана
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="ru.cse.kkm_test.MainActivity">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            android:id="@+id/textView" />
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/button"
            android:onClick="onClick"
            android:layout_below="@+id/textView"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginTop="46dp" />
    </RelativeLayout>
    


    Далее, работаем по официальному руководству.

    Засим позвольте откланяться. Надеюсь кому-то это позволит сохранить время и нервы.
    Если у кого-то есть замечания и подсказказки, с большим удовольствием их выслушаю

    UPD: В связи с изменениями в законодательстве (ФЗ-54), порядок подключения изменился. Читайте об этом в следующей статье.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 6

      0
      напишите, есть ли возможность обрабатывать ответы от принтера с помощью RX. А то я скатился в callback-hell
        0
        Пока изучаю сам работу с данным ККМ.
        Подключение к AS — было первыми граблями, которые пришлось обходить.
        К сожалению, пока что ничем не могу помочь. Но может, кто-нибудь из прочитавших пост, знает по данному вопросу больше.
        +1

        Эм, стандартное подключение нативной библиотеки, гуглится на счёт раз.
        И раз уж на то пошло, не "к" а "в", можно подумать, что статья будет про учёт результатов тестов или что-то подобное.
        Кроме того, основная сложность этих ККМ в кривой библиотеке, а не в том как её подключить.

          0
          ОК, название подправил.
          Собственно статью написал, чтобы не гуглить, а иметь пошаговое руководство.
          Кому-то, может она сэкономит немного времени и нервов.
          0
          Единственное отличие этого решение от вообще принятого стандартного, что джарник помещён в 'src/main/libs/fptrlib.jar'
          Почему именно сюда, а не в стандартный app/libs? Что это меняет?
            0
            Вы забыли еще про so файлы. В них-то и главная сложность.
            Полагаю, что не меняет ничего. Я сделал так.
            P.S.: Я конечно понимаю, что для гуру программирования, это кажется наивно, как комментатор выше меня уже тыкнул. Но для начинающих, может стать неприятной задачей.

          Only users with full accounts can post comments. Log in, please.