Siêu tổng hợp android code snippets (cập nhật thường xuyên)

Tổng hợp các đoạn code hữu ích khi làm việc với android hãy xem vì nó được cập nhật thường xuyên.

Khung sườn của bài viết này.

Dùng ADB để cài đặt và xoá app cho nhanh

Ta không cần phải cầm điện thoại xoá cho mất công, cứ chạy lệnh cho nhanh khi muốn cài và xoá liên tục.

Chạy câu lệnh này bằng Terminal trong Android Studio hoặc của macOS đều được. Chú ý là phải xác định cài và xoá trên device nào.

Xoá app bằng terminal:

adb uninstall jp.co.XXX.XXX

Cài app bằng terminal:

Vào thư mục chứa apk ví dụ: /Documents/android_dev/tenduan/app/release sau đó chạy:

adb install app-universal-release.apk

Vẽ nhanh 1 hình chữ nhật trong onDraw

Cấu hình HCN:
Paint rectPaint = new Paint();
rectPaint.setStyle(Paint.Style.STROKE);
rectPaint.setStrokeWidth(2);
rectPaint.setColor(Color.BLUE);

Vẽ trong onDraw:
canvas.drawRect(new Rect(0, 100, 200, 200, rectPaint);

Vẽ nhanh 1 hình chữ nhật với dash border

rectPaint = new Paint();
rectPaint.setPathEffect(new DashPathEffect(new float[]{4, spaceDash, 9, spaceDash, 9, spaceDash, 33, spaceDash, 9, spaceDash, 9, spaceDash, 4}, 100));
rectPaint.setStyle(Paint.Style.STROKE);
rectPaint.setStrokeWidth(6);
rectPaint.setColor(Color.BLUE);

Vẽ Text với StaticLayout.Builder (API >= 23)

myTextPaint.getTextBounds(textToDraw, 0, textToDraw.length(), rect);
StaticLayout.Builder letG = StaticLayout.Builder.obtain(textToDraw, 0, textToDraw.length(), myTextPaint, rect.width());
letG.setAlignment(Layout.Alignment.ALIGN_NORMAL);
StaticLayout myStaticLayout = letG.build();
myStaticLayout.draw(canvas);

Tạo một ảnh bitmap trong Android bằng Java

Bitmap.Config conf = Bitmap.Config.ARGB_8888;
Bitmap bmp = Bitmap.createBitmap(100, 111, conf);

//chuyển sang byte array nếu muốn lưu vào realm db
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
abc.img = stream.toByteArray();

Bắt sự kiện hiện/ẩn bàn phím trong Android

private void initKeyBoardListener() {
    final int MIN_KEYBOARD_HEIGHT_PX = 150;
    final View decorView = getWindow().getDecorView();
    decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        private final Rect windowVisibleDisplayFrame = new Rect();
        private int lastVisibleDecorViewHeight;

        @Override
        public void onGlobalLayout() {
            decorView.getWindowVisibleDisplayFrame(windowVisibleDisplayFrame);
            final int visibleDecorViewHeight = windowVisibleDisplayFrame.height();

            if (lastVisibleDecorViewHeight != 0) {
                if (lastVisibleDecorViewHeight > visibleDecorViewHeight + MIN_KEYBOARD_HEIGHT_PX) {
                    Log.d(TAG, "SHOW");
                } else if (lastVisibleDecorViewHeight + MIN_KEYBOARD_HEIGHT_PX < visibleDecorViewHeight) {
                    editTextBlock.setVisibility(View.GONE);
                }
            }
            lastVisibleDecorViewHeight = visibleDecorViewHeight;
        }
    });
}

Đóng mở bàn phím ảo trong Android

Mở:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

Đóng:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getRootView().getWindowToken(),0);

Lỗi [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]

Cần thêm đoạn sau vào file app/build.gradle(module app):

splits {
    abi {
        enable true
        reset()
        include 'x86', 'armeabi-v7a', 'x86_64'
        universalApk true
    }
}

Mình gặp lỗi này khi dùng thư viện opencv.

Toạ độ x,y chính là toạ độ pixel trên màn hình

 

Tạo TextView thêm nó vào 1 ViewGroup bất kỳ

TextView textView1 = new TextView(this);
textView1.setText("Test112222");
textView1.setTextColor(Color.BLUE);
textView1.setTextSize(27);
textView1.setBackground(getResources().getDrawable(R.drawable.dotted));
ConstraintLayout rootViewLayout = findViewById(R.id.rootView);
rootViewLayout.addView(textView1);

Unsupported method: BaseConfig.getApplicationIdSuffix()

Nâng cấp phiên bản gradle lên là được.

Tạo keystore bằng command line

keytool -genkeypair -alias upload -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks

trong câu lệnh này keyalias là upload và file .jks được tạo thự mục root của dự án.

Để tạo file pem

keytool -export -rfc -alias upload -file upload_certificate.pem -keystore keystore.jks

 

Để liệt kê các keystore:

Câu lệnh này yêu cầu nhập password:

keytool -list -v -keystore keystore.jks | grep “Alias name\|Creation date”

Kiểm tra service đang chạy hay không?

    public boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }

Cách dùng:
isMyServiceRunning(MyTimerService.class);
Chủ động dừng:
stopService(new Intent(TimerActivity.this, MyTimerService.class));
Bị động dừng:
stopSelf();

Dùng Handler trong Android

tạo Handler và lấy kết quả từ thằng background trả về:

private Handler handler =  new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Toast.makeText(context, ""+msg.obj, Toast.LENGTH_SHORT).show();
        }
    };

Tạo một thằng thread chạy background để trả về cho UI thread thông qua Handler. Ở đây là hàm sau 5s sẽ trả về cho main Ui 1 message.

new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                Message obmes = new Message();
                obmes.what = Integer.parseInt("100");
                obmes.obj = "Tin Nhan";
                handler.sendMessage(obmes);
            }
        }, 5000);

Tham khảo https://developer.android.com/guide/components/processes-and-threads.html

Google họ bảo nên dùng AsyncTask.

Cách dùng AsyncTask

Dùng cái này chạy nền thì vô cùng đơn giản:

Tạo 1 lớp thừa kế lớp AsyncTask và cài đặt các hàm bên trong nó sau đó bên UI thread chỉ cần tạo đối tượng từ lớp đã tạo ở trên và gọi execute(tham số truyền lần lượt) là ok.

https://developer.android.com/reference/android/os/AsyncTask.html

Dùng git thế nào?

  • cài git theo OS
  • cài 1 cái tool quản lý source như github windows
  • Setup tài khoản

Đưa source có sẵn lên repo

  • Tạo repo online.
  • Vào folder chứa source.
  • git init
  • git add .
  • git commit -m “first source”
  • git remote add origin [email protected]:dotrinh/tstt.git (Link này lấy online đã tạo)
  • Lệnh cuối git push -u origin master
  • Lên repo và check again.

Chuyển đổi qua lại độ C và độ F

// Converts to celcius
private float convertFahrenheitToCelcius(float fahrenheit) {
    return ((fahrenheit - 32) * 5 / 9);
}

// Converts to fahrenheit
private float convertCelciusToFahrenheit(float celsius) {
    return ((celsius * 9) / 5) + 32;
}

Dựa vào hướng của điện thoại hiện ra tên của hướng ấy

Có các breakpoint sau:

if (azimuth >= 337.5 || azimuth <= 22.5) {
    hougaku = "N";
    Log.i(TAG, "rotation: N");
} else if (azimuth > 22.5 && azimuth < 67.5) {
    hougaku = "NE";
    Log.i(TAG, "rotation: NE");
} else if (azimuth > 67.5 && azimuth < 112.5) {
    hougaku = "E";
    Log.i(TAG, "rotation: E");
} else if (azimuth > 112.5 && azimuth < 157.5) {
    hougaku = "SE";
    Log.i(TAG, "rotation: SE");
} else if (azimuth > 157.5 && azimuth < 202.5) {
    hougaku = "S";
    Log.i(TAG, "rotation: S");
} else if (azimuth > 202.5 && azimuth < 247.5) {
    hougaku = "SW";
    Log.i(TAG, "rotation: SW");
} else if (azimuth > 247.5 && azimuth < 292.5) {
    hougaku = "W";
    Log.i(TAG, "rotation: W");
} else {
    hougaku = "NW";
    Log.i(TAG, "rotation: NW");
}

Copy file vào điện thoại Android từ MacOS

  • Cài https://www.android.com/filetransfer/
  • Vào điện thoại bật “Settings” > “Storage” > 3 chấm dọc góc phải > “USB computer connection” > chọn “Media device (MTP)
  • OK mở App Anroid File Transfer lên và copy vào.

Đường dẫn Android SDK trong MacOS

/Users/ten_cua_ban/Library/Android/sdk

Các lỗi hay gặp khi làm In-App Purchase

Lỗi inventory bị null do sai public RSA key -1003:Purchase signature verification failed – Ngớ ngẩn không hiểu đội dev của google nghĩ gì ?? Tại sao lại để cái Base64Key kia bị thay đổi??

  • https://github.com/myflashlab/inAppPayments-ANE/issues/23 – public RSA key has been wrong
  • https://stackoverflow.com/questions/14600664/android-in-app-purchase-signature-verification-failed?noredirect=1&lq=1

 

Click vào button và chuyển sang activity mới.

            btnClick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, About.class);
                startActivity(i);
                finish();
            }
        });

Lấy số phiên bản hiện tại của ứng dụng android

private String ver;
----
PackageInfo pInfo = null;
        try {
            pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        ver = pInfo.versionName;

Hiện Toast khi click vào button

        btnSearchWord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this,"WORD",Toast.LENGTH_LONG).show();
            }
        });

Cách Decode file apk android trên Macos

Bước 1: Download dex2jar và jd-gui.
Bước 2: cd vào thư mục đang chứa các file nguồn dex2jar.
Bước 3: gõ: sh d2j-dex2jar.sh -f xxx.apk
*nếu gặp lỗi d2j-dex2jar.sh: line 36: ./d2j_invoke.sh: Permission denied thì chạy sudo chmod +x d2j_invoke.sh
Bước 4: mở file jar bằng jd-gui
Bước 5: Save all source ra là done.

Cách Decode file apk android trên Windows

Bước 1: Download dex2jar và jd-gui
Bước 2: cd vào thư mục đang chứa các file nguồn dex2jar
Bước 3: d2j-dex2jar.bat xxx.apk
Bước 4: mở file jar bằng jd-gui
Bước 5: Save all source ra là done.

Hiển thị một AlertDialog trong android

AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setTitle("Dotrinh.Com");
            builder.setMessage("Title của bạn là?");
            builder.setCancelable(false);
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    Toast.makeText(context, "đã ấn ok", Toast.LENGTH_SHORT).show();
                }
            });
            builder.setNegativeButton("Hủy", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.dismiss();
                }
            });
            AlertDialog alertDialog = builder.create();
            alertDialog.show();

Hiển thị một Dialog trong android

Dialog myDialog = new Dialog(context);
        myDialog.setTitle("Content");
        myDialog.setContentView(R.layout.edit_popup_fragment);
        myDialog.show();

Tạo chức năng chia sẻ khi click vào nút nào đó trong android

shareItBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent i=new Intent(android.content.Intent.ACTION_SEND);
                        i.setType("text/plain");
                        i.putExtra(android.content.Intent.EXTRA_SUBJECT,"Subject test");
                        i.putExtra(android.content.Intent.EXTRA_TEXT, phraseObj.getTxtJapanese());
                        context.startActivity(Intent.createChooser(i,"Chia se"));
                    }
                });

Play nhạc local khi click vào nút trong android

playSoundBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int resIdParam = context.getResources().getIdentifier(musicLink, "raw", context.getPackageName());
                        if (resIdParam != 0) {
                            MediaPlayer mediaPlayer = MediaPlayer.create(context, resIdParam);
                            mediaPlayer.start();
                        }
                        Toast.makeText(context, "Playing...", Toast.LENGTH_SHORT).show();
                    }
                });

Bắt sự kện xoay màn hình trong android

Đơn giản chỉ cần ghi đè lại hàm onConfigurationChanged. Nếu đang dùng 2 file layout riêng cho màn hình thì cần set lại content view trong hàm này.

Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.yourxmlinlayout-land);
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        setContentView(R.layout.yourxmlinlayoutfolder);
    }
}

Và đừng quên thêm android:configChanges=”orientation|screenSize” vào Manifest nhưu thế này.

<activity android:name=".MainActivity" android:theme="@style/Theme.AppCompat.NoActionBar"
android:configChanges="orientation|screenSize">

</activity>

Trang thống kê mức độ phổ biến của các phiên bản Android

???? Developer Android

Có thể thêm nhiều style trong một thẻ item không?

Câ trả lời là không.

Nhưng có nhều cách có thể thực hiện việc  kết hợp nhiều style lại với nhau:

  • Thừa kế style bằng thuộc tính parent
<style name="Side_Menu_Button" parent="android:attr/buttonStyleSmall">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">match_parent</item>
</style>Lồng các thành pần có thuộc tính style lại với nhau.
  • Lồng nhau như thế này
<LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  style="@style/padding">

  <TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Bold text with padding"
    style="@style/text_bold" />

</LinearLayout>

Lấy tên của tài khoản email đang dùng trong android

    public String getUsername() {
        AccountManager manager = AccountManager.get(getContext());
        Account[] accounts = manager.getAccountsByType("com.google");
        List<String> possibleEmails = new LinkedList<String>();

        for (Account account : accounts) {
            possibleEmails.add(account.name);
        }

        if (!possibleEmails.isEmpty() && possibleEmails.get(0) != null) {
            String email = possibleEmails.get(0);
            String[] parts = email.split("@");

            if (parts.length > 1)
                return parts[0];
        }
        return null;
    }

Show/Hide Status Bar

// Hide status bar
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
// Show status bar
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

Lưu ý trước khi đưa app lên store

  • Xem lại số. Nếu là update thì versionCode đã cao hơn phiên bản trước chưa? Còn upload mới thì để mặc định là 1. Mã này rất quan trọng, nếu versionCode thấp hơn hoặc bằng sẽ không update app được.
  • Tên phiên bản để cho user nhìn thấy versionName, Mã này để làm cảnh là chủ yếu thích để số bao nhiêu cũng được.
  • Nếu có tích hợn In-App Billing thì đã tắt chế độ debug?
  • Kiểm tra trên các bản Android cũ hơn lần cuối.
  • Đã chuyển sang Build Variant là Release?
  • Đã tạo bản Signed APK?
  • Dùng các thư viện như GSON, Glide, PICASSO, EVENTBUS,… thì đã thêm các rule vào file app/proguard-rules.pro hay chưa, nếu chưa sẽ bị crash khi cài apk đã ký.
  • Đặc biệt khi dùng GSON thì cần phải lưu ý các enum tên viết hoa không nó sẽ không hiểu. Để giải quyết vấn đề này bạn tạo file theo hướng dẫn này https://medium.com/@hanru.yeh/gson-will-crash-at-enum-fields-in-custom-class-with-proguard-bbcf5ad1b623 Hoặc không thì đổi hết tên enum viết hoa sang viết thường cho an toàn.
  • Khi làm được tầm 80% dự án ta nên release thử bẳn signed apk và test trên nheieuf thiết bị đề phòng có lỗi to mất nhiều thời gian để sửa.

Trong tab Store Listing

  • Tên app sẽ được hiện ra cho người dùng
  • Phần hiển thị ngắn khi mới mở app
  • Mô tả đầy đủ cho app
  • Screenshot hiển thị các anh để slide qua lại
  • Hi-res Icon là icon cho ảnh 512×512
  • Feature Graphic là ảnh để hiển thị trên thiết bị
  • Đánh giá nội dung rate 3+ chẳng hạn
  • Email sẽ được hiện cho ngừoi dùng
  • Website cũng hiện cho user

Tạo index cho một trường trong SQLite

    • Truy cập file trong cmd: sqlite3 duong_dan_den_file
    • Xem tất cả các bảng trong db: .tables
    • Tạo ra index cho một trường trong bảng: CREATE INDEX tên_index ON tên_bảng (tên_trường);. ex:  CREATE INDEX english_index ON phrase (english);
    • Chọn theo điều kiện: SELECT * FROM phrase WHERE english = ‘Hello’;
    • Kiểm tra xem có những cột nào được index: .indices tên_bảng
    • Xem cái trường đang thao tác có được index hay không thêm Explain query vào đầu câu lệnh

Ex: EXPLAIN QUERY PLAN SELECT * FROM phrase WHERE english = ‘Hello’;
Kết quả: 0|0|0|SEARCH TABLE phrase USING INDEX salary_index (english=?)

Failed to resolve: com.google.firebase:firebase

  • Lỗi thứ nhất có thể là do bạn chưa setup proxy hoặc thông tin proxy bị sai.
  • Lỗi thứ 2 có thể do bạn chưa thêm google play service và google Repository trong SDK Tool hãy thêm vào rồi sync lại là ok.

Tích hợp thanh toán trong android App

  • Dùng In-App Purchase của Google
  • Cái này không test được ở chế môi trường dev, phải test khi app được đưa lên store tức là bản này đã đc signed.
  • Có 2 loại là bán theo từng item (bán đứt 1 sản phẩm) hoặc theo subscription (bán theo kỳ như tháng, năm)

Tạo danh sách dạng list hay grid trong Android

  • Dùng thư viện RecylerView và CardView cách này được khuyến khích nhất.
  • Có thể dùng Listview cách cũ của Google.

Về thư viện hỗ trợ trong Android

Giấu code trong android

  • Thực ra cái này là làm rối code thì đúng hơn.
  • Dùng file gradle mức module và chú ý biến proguardFiles

Tóm tắt Broadcast

  • Broadcast dùng để nghe những sự kiện mà hệ điều hành bắn ra hoặc từ những app khác bắn ra.
  • Lắng nghe theo 2 cách, cách 1 là định nghĩa trong Manifest, cách 2 là extends Broadcast trong lúc runtime.
  • Nghe trong manifest thì nó sẽ luôn luôn lắng nghe dù có tắt app (destroy activity) hay nó luôn chạy ngầm.
  • Nghe trong lúc runtime thì khi nào activity bị destroy thì các broadcast ấy cũng bị hủy đăng ký (unregister).
  • Mình cũng có thể bắn broadcast cho app khác được.

Cách dùng SharedPreferences trong Android

Tạo và ghi giá trị mới:

 //新規のデータ生成
                SharedPreferences sharedPreferences = getSharedPreferences("OKONOMI", Context.MODE_PRIVATE); // Tạo
                SharedPreferences.Editor editor = sharedPreferences.edit(); // Dùng đối tượng editor để ghi
                editor.putInt("oldVersion", 1);
                editor.apply(); // Chú ý khác với commit

Đọc giá trị:

SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
int oldVersion = sharedPref.getInt("oldVersion",1);

 

Lỗi Android Studio Emulator “/dev/kvm is not found” trên

MacOS

Mở terminal lên và thực hiên các bước sau:

B1: cd /Users/trinh.thanh.do/Library/Android/sdk

B2: cd /extras/intel/Hardware_Accelerated_Execution_Manager/

B3: ./HAXM\ installation -u

Sau đó vào Setting của hệ điều hành và chọn Security & Privacy, click vào Allow là ok.

Lấy ngày cài đặt App

Tạo hàm này:

public static long getAppFirstInstallTime(Context context) {
        PackageInfo packageInfo;
        try {
            if (Build.VERSION.SDK_INT > 8/*Build.VERSION_CODES.FROYO*/) {
                packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
                return packageInfo.firstInstallTime;
            } else {
                ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0);
                String sAppFile = appInfo.sourceDir;
                return new File(sAppFile).lastModified();
            }
        } catch (PackageManager.NameNotFoundException e) {
            //should never happen
            return 0;
        }
    }

Dùng nó:

long oldDate = getAppFirstInstallTime(this);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String installTime = dateFormat.format(new Date(oldDate));
Log.d("Ngay & gio cai dat app la", "" + installTime);

Gửi Email khi click vào nút

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String[] smailA = new String[]{"[email protected]"};
                composeEmail(smailA,"OK BABE");
            }
        });
    }

    public void composeEmail(String[] addresses, String subject) {
        Intent intent = new Intent(Intent.ACTION_SENDTO);
        intent.setData(Uri.parse("mailto:"));
        intent.putExtra(Intent.EXTRA_EMAIL, addresses);
        intent.putExtra(Intent.EXTRA_SUBJECT, subject);
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
        }
    }

Gọi điện thoại đến 1 số bất kỳ

public void dialPhoneNumber(String phoneNumber) {
    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:" + phoneNumber));
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Thiết lập chức năng hệ thống

public void openWifiSettings() {
    Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS

Đọc thêm blog https://dkstudiostore.blogspot.jp/2017/

 

Tạo ảnh bitmap và lưu vào album

Bitmap resizedbitmap1 = createImage(500,500,Color.BLUE);
saveImage(resizedbitmap1,"test");
 private void saveImage(Bitmap finalBitmap, String image_name) {

        String root = Environment.getExternalStorageDirectory().toString();
        File myDir = new File(root);
        myDir.mkdirs();
        String fname = "Image-" + image_name+ ".jpg";
        File file = new File(myDir, fname);
        if (file.exists()) {
            file.delete();
        }
        Log.i("LOAD", root + fname);
        try {
            FileOutputStream out = new FileOutputStream(file);
            finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Bitmap createImage(int width, int height, int color) {
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        paint.setColor(color);
        canvas.drawRect(0F, 0F, (float) width, (float) height, paint);
        return bitmap;
    }

Custom font cho Textview

Copy font vào thư mục fonts, full path sẽ là thế này: app/src/main/assets/fonts/actionj.ttf

Typeface custom_font = Typeface.createFromAsset(getAssets(), "fonts/actionj.ttf"); tapLabelToNew.setTypeface(custom_font);

Các bài viết không xem thì tiếc:

Chia sẻ là sexy

dotrinh

Một lập trình viên dũng cảm, hòa đồng, luôn sống tích cực và anh ấy quay tay khỏe và khéo trong môn bi lắc :) Xem thêm thông tin tại trang -> Giới thiệu

Thảo luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.