Skip to main content
Minh Nong
💬
0 discussions

Android Shell

1. Điều kiện tiên quyết

  • Tài khoản android developer
  • Tài khoản firebase ( enable service Firebase App Distribution - free )
  • Được assign vào repo
  • Android studio
  • Ruby 2.7.6

2. Đối tượng đọc

  • Stage Owner
  • Customer Success Engineer
  • Customer Success Specialist

3. Nội dung chi tiết

Bài viết hướng dẫn cài đặt Android Shell bao gồm 3 phần, cài đặt app, deploy và các config liên quan

3.1. Cài đặt App

  • Install Android Studio

  • Clone repo gcallsshell

    $ cd src 
    $ npm i

  • Config sdk cho thư mục android

     $ cd android 
$ nano local.properties

sdk.dir='đường dẫn tới sdk file'
note : có thể tìm đường dẫn sdk bằng cách, mở Android Studio -> tìm trong phần sdk manager


  • Chỉnh lại root trong defaul.env sau đó copy và paste vào terminal

  • Kết nối điện thoại Android vào máy tính và test thử

    $ npm run start

    chọn run Android

  • Kiểm tra gọi ra từ Hubspot Mobile App

```

Sau khi đăng nhập vào hubspot mobile app, Menu -> Contacts -> Chọn 1 contact record và bấm Call -> Bấm vào luôn chọn Gcalls


```

3.2. Cấu trúc folder android cần biết

  • Thư mục android/app/build/outputs : Chứa file apk sau khi build

  • Thư mục android/app/src/main/java/co/gcalls/shell : Chứa code native của Android (java)

  • Thư mục android/app/src/main/res : Chứa UI native của Android ( icon, layout )

  • Thư mục android/app/src/main/res/xml : chứa các file xml định nghĩa cấu trúc obj của Android

  • File android/app/src/main/AndroidManifest.xml : Dùng để khai báo permistions, Activity

  • File android/app/src/main/java/co/gcalls/shell/MainActivity.java : Có thể override và implement các activity lifecycle của Android, link tham khảo

    Ví dụ : Hình sau là android lifecycle

    Chúng ta có thể Override function onStart() của android và viết thêm chức năng checkDefaultHandler() khi app vừa mở lên, tham khảo function checkDefaultHandler() trong file MainActivity.java

  • Intent và Intent Fillter : Dùng để request action từ app https://developer.android.com/guide/components/intents-filters

    • Ví dụ:

    Xem hàm handleIntent ( dùng để bắt ACTION_CALL từ android và chuyển sang deeplink dạng tel:phoneNumber vì Input của ReactNative cho android đang nhận là deeplink, khi ReactNative nghe thấy deeplink dạng tel:phonenumber, thì sẽ hỏi để mở app) trong MainActivity.java

    • Các thư viện liên quan :
import android.telecom.TelecomManager;
import android.telephony.TelephonyManager;

// TelephonyManager dùng để lắng nghe CALL_STATE của android
// telephonyManager.listen(myPhoneStateListener, GcallsPhoneStateListener.LISTEN_CALL_STATE);
// TelecomManager dùng để khai báo và set Handler

  • android/app/src/main/java/co/gcalls/shell/provider: Trong thư mục này chứa config để thực hiện viện sync contact của với server ( có thể viết api bằng java) . Hiện chỉ mới setting, chưa implement

3.3. Tích hợp các cuộc gọi ra từ call button của Android

Trong AndroidManifet.xml phải có

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-feature android:name="android.hardware.telephony" android:required="true" />

Bước 1 : Viết receiver để lắng nghe NEW_OUTGOING_CALL của android

  • Viết 1 receiver để lắng nghe NEW_OUTGOING_CALL của android bao gồm call button từ keypad, contact list ( check file /AndroidManifest.xml phần .contacts.CallButtonInterceptor)

  • Đoạn .contacts.CallButtonInterceptor có ý nghĩa : file CallButtonInterceptor trong thư mục contacts (android/app/src/main/java/co/gcalls/shell/contacts)

  • Trong File android/app/src/main/java/co/gcalls/shell/contacts/CallButtonInterceptor.java là nơi để lắng nghe và xử lý action call của android, sau đó format theo đúng Input của ReactNative mà chúng ta quy định để system mở app ReactNative thông qua intent-filter từ file manifet .

Bước 2 : Action Call từ Hubspot, và Action Call từ Contact của Android Messenger App

  • Khi thực hiện Call từ Hubspot và Messenger App, ACTION_CALL sẽ được kích hoạt thông qua onNewIntent() của Android, từ đây chúng ta Override hàm onNewIntent chặn ACTION_CALL, chuyển thành ACTION_VIEW và format lại số điện thoại theo scheme dạng tel: để Gcalls app nghe được và nhận số điện thoại ( check function onNewIntent trong file MainActivity )

3.4. Android sensitive permissions

  • Tiếp theo là phần Request User Consent, phải làm promt để hỏỉ user có muốn chọn App trở thành default handler ( default phone app)

  • Ở mục Complete the Permissions Declaration Form phải thực hiện 7 step, nêú không hoàn thành khi release thì Google sẽ reject vơí lý do tương ứng. Ví dụ :

    • Không nêu rõ core functionality cho handler

  • Nêú đã fix mà vẫn bị reject thì thực hiện Appeal

Đây là thư cuả Google hướng dẫn chi tiết cần phaỉ sưả chỗ naò, và nhấn mạnh ý "Without the core feature(s), the app is "broken" or rendered unusable."

  • Sau khi viết laị phần description ở Main store listing theo đúng ý Google thì được cho qua bước naỳ

  • Review app chỉnh sửa theo yêu câù cuả Google qua các bước, nêú pass review thì app sẽ đươc publish

3.5. FastLane - Manual từ local

Lưu ý lần đầu public app bằng tay rồi mới sử dụng fastlane

  • Fastlane có 2 phần:
    • Fastlane : Manual deploy
    • Fastlane : Gitlab CICD ( Sẽ được đề cập trong tài liệu Omnipush)

Hiện tại Fastlane chỉ work tốt khi không có các sensitive permissions, khi có các sensitive permissions, push app thẳng lên store qua lane production sẽ bị trả lỗi từ Google

$ export GOOGLE_APPLICATION_CREDENTIALS= fullpath/google_credential.json
$ cd android
// install fastlane and related package
$ bundle update
$ fastlane demo


Có thể danh sách tester cho android ở android/fastlane/Fastfile

  • Kiểm tra play_store_json_key có hoạt động tốt hay không có hoạt động tốt hay không và upload app lên store từ Local
$ cd android/secure/
$ bundle exec fastlane action validate_play_store_json_key 'store_key.json'
$ cd android
$ fastlane production


Chờ review và lên store kiểm tra App

3.6. Các file config


Quản lý App permissions, deeplink
src/android/app/src/main/AndroidManifest.xml

Handle số điện thoại từ hubspot
src/android/app/src/main/java/co/gcalls/shell/MainActivity.java

4. Kết Luận

  • Để cài đặt dễ dàng cần chú ý đến môi trường cài đặt, do fastlane sử dụng ruby để chạy

  • Tài liệu này hướng dẫn cách cài đặt Android Shell, mục tiêu là lấy được số điện thoại từ android (call button from contact list, messenger app, keypad) chuyển vào callbox để thực hiện call Hiện tại có thể đạt được những mục tiêu trên nhưng chưa đạt kỳ vọng

    • Ví dụ: Ở Call button của danh bạ trong messenger app và Hubspot, nếu không set luôn luôn mặc định gọi ra bằng Gcalls app có thể bị system hỏi chọn Gcalls app 2 lần
  • Còn gặp khó khăn trong việc quản lý thiết bị và android version ( điện thoaị naỳ chaỵ được mà điện thọai kia không chạy được ..v..v)

Hiện tại baì viết còn nhiều thiếu sót nếu có góp ý xin vui lòng điền vào form bên dưới