Một số điểm mới trên Android Emulator


Trình giả lập Android đã mang đến cho chúng ta nhiều tiện ích một vài tiện ích mà trước đi khi tôi làm việc với trình giả lập này rất khó chịu  đó là:

  1. Chế độ khởi động nhanh – Quick Boot: chắc hẳn bạn nào làm việc với trình giả lập này từ các phiên bản đầu cảm thấy rất khó chịu khi phải đợi rất lâu để chúng hoàn thành việc khởi động, nhưng với v27.0.2 thời gian này chỉ còn 6s thôi -> quá hấp dẫn đối với tôi.
  2. Tích hợp sẵn Google Play: chắc hẳn Google đã lắng nghe ý kiến của các lặp trình viên khi họ tạo ra các máy ảo Android có tích hợp sẵn luôn Google Pay thứ mà các phiên bản trước lập trình viên phải rất vất cả để cài thêm vào máy ảo.
  3. Cho pháp copy và paste giữa PC và trình giả lập => trước đây nó là thứ mà mỗi khi chạy thử các phần mềm rất dễ điên khi phai gõ từ ký tự từ bàn phím hoặc bàn phiếm ảo 🙂
  4. Tính năng kéo vào thả file apk để cài đặt phần mềm lên trình giả lập.

Bên trên theo tôi là những cải tiến giúp ích rất nhiều cho lập trình viên.

Đầy đủ hơn các bạn tham khảo thêm ở đây

 

Advertisements

Lập trình và biên dịch Java bằng IED online


Công cụ đang giai đoạn beta nhưng thây hữu ích nên share mọi người tham khảo

https://repl.it/M9ho/4

java

Chỉ học ngôn ngữ lập trình thôi thì là vừa đủ

Hướng dẫn sử dụng Typeface trong Android


Screenshot_1499341259.png

public class MainActivity extends Activity {

   MediaPlayer mediaPlayer1, mediaPlayer2;

   SharedPreferences pre;

   Button btn1, btn2;

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

       getWindow().getDecorView().setSystemUiVisibility(

               View.SYSTEM_UI_FLAG_FULLSCREEN

               |View.SYSTEM_UI_FLAG_IMMERSIVE

               |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY

               |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION

       );

       mediaPlayer1 = MediaPlayer.create(MainActivity.this, R.raw.animals137);

       mediaPlayer2 = MediaPlayer.create(MainActivity.this, R.raw.animals066);

       pre = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);

       ((CheckBox)findViewById(R.id.chkSound)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

           @Override

           public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

               SharedPreferences.Editor editor = pre.edit();

               editor.putBoolean(“play”, isChecked);

               editor.commit();

               if(isChecked) {

                   mediaPlayer2.setLooping(true);

                   mediaPlayer2.start();

               }

               else

               {

                   if(mediaPlayer2.isPlaying())

                   {

                       mediaPlayer2.stop();

                   }

               }

           }

       });

       btn1 = (Button) findViewById(R.id.btnPlay);

       btn2 = (Button) findViewById(R.id.button);

       Typeface font = Typeface.createFromAsset(getAssets(), “fonts/font.ttf”);

       btn1.setTypeface(font);

       btn2.setTypeface(font);

   }

   @Override

   protected void onResume() {

       super.onResume();

       boolean sound = pre.getBoolean(“play”, false);

       if(sound) {

           mediaPlayer2.setLooping(true);

           mediaPlayer2.start();

       }

       ((CheckBox)findViewById(R.id.chkSound)).setChecked(sound);

   }

   @Override

   protected void onPause() {

       super.onPause();

       if(mediaPlayer2.isPlaying())

       {

           mediaPlayer2.stop();

       }

       if(mediaPlayer1.isPlaying())

       {

           mediaPlayer1.stop();

       }

   }

   public void play(View view) {

       mediaPlayer1.start();

   }

   public void start(View view) {

       Intent start = new Intent(MainActivity.this, Home.class);

       startActivity(start);

       finish();

   }

}

Cơ chế kiểm quyền Android 6


Từ khi Android M phát hành Google đã thay đổi cơ chế cấp quyền sử dụng cho các ứng dụng (các phiên bản trước thì chúng ta không cần kiểm tra quyền khi chạy mà quyền được cấp khi cài đặt phần mềm):

  1. Các quyền sẽ không cần phải xác nhận khi cài đặt phần mềm mà xác nhận với người dùng khi họ chạy các chức năng cần quyền (Runtime Permission).
  2. Chúng ta có thể thu hồi quyền đã cấp cho ứng dụng mà không cần gỡ ứng dụng.

Hệ thống phân chia thành 02 dạng quyền:

Các quyền thống thường sẽ được cấp tự động cho ứng dụng. Các quyền này chúng ta chỉ việc khai báo ở Manifest khi chạy hệ thống sẽ tự cấp phát

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT

Các quyền có khả năng gây hại cho hệ thống cần phải cấp quyền và có xác nhận của người dùng (các quyền còn lại).

Ví dụ: Chúng ta có chức năng cần sử dụng 03 quyền là: Truy cập Internet(quyền bình thường hệ thống tự cấp chỉ cần khai báo trong Manifest), Quyền đọc/ghi thông tin vào bộ nhớ ngoài 02 quyền này cần phải đăng ký và có sự xác nhận của người dùng là cho phép hay không ?

Nội dung đăng ký ở Manifest như sau:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Khi mở ứng dung chúng ta kiểm tra nếu chưa cấp quyền thì hỏi người dùng có đồng ý cấp quyền để chạy hay không?

// Android 6 hoặc cao hơn
if (Build.VERSION.SDK_INT >= 23) {
    // Kiem tra quyen
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
            || ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)
                || ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        } else {
            // Hien thi hop thoai cap quyen va cho nguoi dung xac nhan cho phep hay khong.
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 113);
        }
    }
    else
    {
        permissionGrant = true;
    }
}

Khi chúng ta sử dụng phương thức

ActivityCompat.requestPermissions

đề yều cần quyền thì hệ thống sẽ hiển thị hộp thoại để người dùng chọn là đồng ý cấp quyền hay là không

per1.png

Tại đây cho dù người cho phép hay không thì hệ thống cũng sẽ trả về thống tin cho ứng dụng, để đón nhận kết quả chúng ta định nghĩa lại hàm

@Override
public void onRequestPermissionsResult(int requestCode,
                 String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 113: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                permissionGrant = true;
            } else {
                permissionGrant = false;
            }
            return;
        }
    }
}

Như vậy nếu chúng ta cập quyền thì thông tin về quyền người dùng sẽ đc ghi nhớ và không hỏi lại ở lần sử dụng tiếp theo. Tuy nhiên chúng ta cũng  có thể thu hồi quyền đã cấp qua giao diện quản lý ứng dụng của Android.

per2.png

Đây cũng là điểm khắc biệt cần phải lưu ý khi phát triển ứng dụng Android.