12/08/2018, 14:31

Khám phá Androd API

Ngày nay có rất nhiều thư viện mà chúng ta có thể sử dụng trên nền tảng Android, nhưng đôi khi sẽ là rất tốt nếu chúng ta sử dụng các Android API có sẵn, với một vài class và method hữu ích. Hiện tại API Android đang mở rộng các API Java SE là đã rất lớn, theo thống kê, Java SE 8 có 217 package với ...

Ngày nay có rất nhiều thư viện mà chúng ta có thể sử dụng trên nền tảng Android, nhưng đôi khi sẽ là rất tốt nếu chúng ta sử dụng các Android API có sẵn, với một vài class và method hữu ích. Hiện tại API Android đang mở rộng các API Java SE là đã rất lớn, theo thống kê, Java SE 8 có 217 package với 4240 class, trong khi Java SE 7 có 209 package với 4024 class.

Chúng ta sẽ nghiên cứu một vài API trên nền tảng Android với nhiều chức năng khác nhau.

  1. Spell checker

Spell Checker API có thể được truy cập ở bất cứ đâu thông qua các class TextServicesManager từ API level 14 và từ Jelly Bean (API level 16), có check ngay cả với một câu văn.

Việc sử dụng rất đơn giản, thông qua TextServicesManager một SpellCheckerSession có thể được tạo ra cho phép thiết lập locale và một số thông số ban đầu:

TextServicesManager tsm = (TextServicesManager) getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);  
SpellCheckerSession spellCheckerSession = tsm.newSpellCheckerSession(null, null, this, true);  

Kết quả có thể nhận được bởi implement SpellCheckerSessionListener interface trong phương thức : onGetSuggestions(SentenceSuggestionsInfo[] sentenceSuggestionsInfos) / onGetSentenceSuggestions(SentenceSuggestionsInfo[] sentenceSuggestionsInfos)

Kết quả sẽ được lưu trữ trong mảng SentenceSuggestionsInfo nơi chứa các text chính xác, offset và tất cả các thông tin có liên quan được lưu trữ.

  1. Text Recognizer

Visual Text Recognizer là từ các API của Google Play Services Vision có thể dễ dàng include trong dự án với một gradle dependency. Xin lưu ý rằng bạn không bao giờ nên import tất cả các Play Service, vì nó là rất lớn và thường chỉ là một phần nhỏ của nó được sử dụng. Ở đây bạn có thể kiểm tra các dependecy Play Service API khác nhau: https://developers.google.com/android/guides/setup

Vision API bao gồm 3 API:

  • Face recognition
  • Barcode scanning
  • Text recognition

Và chúng ta sẽ tìm hiểu sự dễ dàng khi sử dụng Text Recognizer API.

Trước hết, chúng ta cần import Play Service Vision trong build.gradle:

compile 'com.google.android.gms:play-services-vision:10.0.1'  

Việc sử dụng rất đơn giản, một object TextRecognizer sẽ được yêu cầu khi start tiến trình:

TextRecognizer textRecognizer = new TextRecognizer.Builder(context).build();  

Đối với xử lý kết quả, một interface Detector.Processor phải được implement. Các text được phát hiện chuyển đến một mảng TextBlock, từ nơi mà các text coordinate và string có thể được lấy ra.

public class OcrDetectorProcessor implements Detector.Processor<TextBlock> {

    @Override
    public void receiveDetections(Detector.Detections<TextBlock> detections) {
        ...
        SparseArray<TextBlock> items = detections.getDetectedItems();
        ...
    }

    @Override
    public void release() {
    }
}

Để sử dụng các TextRecognizer chính xác, cần có một SurfaceView để có thể hiển thị màn hình camera preview.

  1. TimingLogger

Trong Android có một lớp TimingLogger đặc biệt mà có thể được sử dụng một cách dễ dàng để đo thời gian trôi qua giữa các tin nhắn đăng nhập trong một sequence như sau:

D/TAG_MYJOB: MyJob: begin  
D/TAG_MYJOB: MyJob:      2002 ms, Phase 1 ready  
D/TAG_MYJOB: MyJob:      2002 ms, Phase 2 ready  
D/TAG_MYJOB: MyJob:      2001 ms, Phase 3 ready  
D/TAG_MYJOB: MyJob: end, 6005 ms  

Để start tiến trình log, một TimingLogger cần được khởi tạo trước:

TimingLogger timings = new TimingLogger("TAG_MYJOB", "MyJob"); 

Sau đó với phương thức addSplit(..) to log các entry sẽ được tạo:

timings.addSplit("Phase 1 ready");  

Các log message sẽ không được hiển thị ngay lập tức trong LogCat trừ khi chúng ta gọi hàm dumpToLog:

timings.dumpToLog();  

Để sử dụng TimingLogger, nó phải được enable TAG để dùng thông qua adb shell:

setprop log.tag.TAG_MYJOB VERBOSE  
  1. Taking screenshot

Trong nhiều trường hợp, sẽ rất hữu ích để có một ảnh chụp màn hình từ điện thoại hoặc giả lập. Các thư viện hiện có như Falcon hoặc từ API level 21 có thể sử dụng API MediaProjection, thậm chí dùng để stream nội dung màn hình và âm thanh hệ thống trong thời gian thực. Tuy nhiên đôi khi nó là đủ để sử dụng các API tiêu chuẩn của Android cho chỉ đơn giản nhận được nội dung của màn hình như một Bitmap qua GetWindow ():

View viewRoot = getWindow().getDecorView().getRootView();  
viewRoot.setDrawingCacheEnabled(true);  
Bitmap screenShotAsBitmap = Bitmap.createBitmap(viewRoot.getDrawingCache());  
viewRoot.setDrawingCacheEnabled(false);  
// use screenShotAsBitmap as you need

  1. Tạo PDF

Từ API level 19 API Creation PDF có sẵn trong Android mà cho phép tạo ra một tài liệu PDF từ nội dung Android native.

Điều quan trọng là class PDFDocument đại diện cho một tài liệu PDF, đầu tiên một trang mới đã được tạo ra với method StartPage của PDFDocument ([pageInfo]) đòi hỏi một đối tượng PageInfo mà chúng ta có thể tạo ra thông qua một builder : new PdfDocument.PageInfo.Builder ( w, h, pageNum) .Create ();

Các method ví dụ sau đây tạo ra một file demo.pdf trong hệ thống tập tin và put nội dung màn hình hiện tại trong tài liệu:

public void createPdfFromCurrentScreen() {  
    new Thread() {
        public void run() {
            // Get the directory for the app's private pictures directory.
            final File file = new File(
                    Environment.getExternalStorageDirectory(), "demo.pdf");

            if (file.exists ()) {
                file.delete ();
            }

            FileOutputStream out = null;
            try {
                out = new FileOutputStream(file);

                PdfDocument document = new PdfDocument();
                Point windowSize = new Point();
                getWindowManager().getDefaultDisplay().getSize(windowSize);
                PdfDocument.PageInfo pageInfo =
                        new PdfDocument.PageInfo.Builder(
                        windowSize.x, windowSize.y, 1).create();
                PdfDocument.Page page = document.startPage(pageInfo);
                View content = getWindow().getDecorView();
                content.draw(page.getCanvas());
                document.finishPage(page);
                document.writeTo(out);
                document.close();
                out.flush();

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(PDFCreateActivity.this, "File created: "+file.getAbsolutePath(), Toast.LENGTH_LONG).show();
                    }
                });
            } catch (Exception e) {
                Log.d("TAG_PDF", "File was not created: "+e.getMessage());
            } finally {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}
0