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.
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.
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.
- gõ 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=?)
- Xóa index: DROP INDEX idx_name;
- Thoát shell db: ctrl+C
- Tham khảo thêm http://www.sqlitetutorial.net/sqlite-index/
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
- Android có nhiều gói thư viện hỗ trợ như lib v4, lib v7 mỗi gói lại có các gói con hỗ trợ phiên bản android cũ hơn hoặc thêm vài tính năng mới.
- Tham khảo thêm https://developer.android.com/topic/libraries/support-library/packages.html
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);
Thuộc tính android:noHistory=”true” trong Activity
Nếu ta để thuộc tính này trong Manifest thì khi vào background sẽ Activity bị destroy, tức là nó sẽ chạy vào hàm onDestroy()
Xem các service đang chạy của app và filter với từ khoá “mididemo”
adb shell dumpsys activity services mididemo
mididemo là tên app chẳng hạn
Các bài viết không xem thì tiếc:
- Truyền dữ liệu giữa 2 fragment trong android
- Chuyển một đối tượng sang Json trong Android
- Truyền dữ liệu giữa các Activity trong android
- Lập trình với Recyclerview trong Android – Bài 2 | dotrinh.com
- Cách dùng AsyncTask trong Android
- Lập trình với Recyclerview trong Android – Bài 1 | dotrinh.com
- Lập trình phóng to thu nhỏ ảnh pinch in – pinch out trong Android
- Show Indicator trong Android | Hiển thị indicator trong Android
- Tạo shortcut cho ứng dụng khi cài Android app programmatically
- Cách dùng Eventbus để truyền dữ liệu trong Android
- Hiểu về cách tổ chức file, bộ nhớ của app Android
- Lập trình với Recyclerview trong Android – Bài 3 | dotrinh.com
- Tạo seekbar và kiến thức hữu ích về seekbar trong Android
- KHÔNG CÀI ĐƯỢC APP TRONG ANDROID
- Làm sao thiết kế nhiều màn hình trong Android