Friday, November 9, 2012

stackoverflow - How to get screen dimensions

Question:

I created some custom elements and I want to programatically place them to the upper right corner (n pixels from the top edge and m pixels from the right edge) therefore I need to get the screen width and screen height and then set position:
int px = screenWidth - m;
int py = screenWidth - n;
Does anyone know how to get screenWidth and screenHeight in the main Activity?
Thanks

Best Answer:
If you want the the display dimensions in pixels you can use getSize:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
If you're not in an Activity you can get the default Display via WINDOW_SERVICE:
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Before getSize was introduced (in API level 13), you could use the getWidth and getHeightmethods that are now deprecated:
Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated
For the use case you're describing however a margin/padding in the layout seems more appropriate.
Source: http://stackoverflow.com/questions/1016896/android-how-to-get-screen-dimensions

Friday, October 12, 2012

Networking - Bài 2

Client server
  • Để xử lý nhiều  yêu cầu kết nối với các mục đích khác nhau và chúng đến gấn như đồng thời modern server operating system sử dụng khái niệm port
  • Port không phải là thiết bị vật lý, chúng đại diện cho một vùng nhớ cụ thể của máy tính
  • Server có thể lắng nghe trên nhiều port tại một address
  • Mọi máy tính với địa chỉ IP đều hỗ trợ một phạm vi hàng nghìn port cho phép xử lý nhiều kết nối cùng lúc
  • Port được chia ra thành 3 phạm vi:
    • Well-known ports: 0 -> 1023
    • Registered ports: 1024 -> 49151
    • Dynamic and/or private ports: 49152 -> 65535
Checking network status

  • Android cung cấp các tiện ích của host để xác định các hình thiết bị và trạng thái của các dịch vụ khác nhau bao gồm cả network.
  • Lớp ConnectivityManager xác định kết nối mạng có tồn tại hay không và để get các cảnh bảo về sự thay đổi trên mạng.
  • Đoạn code dưới đây là một phần của main Activity trong ứng dụng NetworkExplorer thể hiện cách sử dụng cơ bản của ConnectivityManager.
@Override
public void onStart() {
super.onStart();
ConnectivityManager cMgr = (ConnectivityManager)
this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cMgr.getActiveNetworkInfo();
this.status.setText(netInfo.toString());
}

    • Ví dụ trên cho bạn thấy bạn có thể lấy một handle cho ConnectivityManager thông qua phương thức getSystemService của ngữ cảnh bằng cách truyền vào hằng số CONNECTIVITY_SERVICE.
    • Khi bạn đã có được mannager bạn có thể lấy được thông của mạng thông qua đối tượng của lớp NetworkInfo
  • Phương thức isAvailable hoặc isConnected(trả về giá trị boolean) được sử dụng để kiểm tra kết nối mạng
  • Có thể truy vấn trực tiếp NetworkInfo.State sử dụng phương thức getState. State là một enum định nghĩa các trạng thái thô của kết nối. Các giá trị của nó CONNECTED, CONNECTING, DISCONNECTED, DISCONNECTING.

2D Graphich


1.     Color
·        Màu sắc trong android được đại diện bởi 4 con số cho alpha, red, green, blue (ARGB). Mỗi thành phần có 256 giá trị ó 8 bits vì thế nó được đóng gói trong 32-bit Integer.
·        Alpha thể hiện cho độ trong suốt. Giá trị thấp nhất là 0 ó trong suốt. Giá trị lớn nhất là 255 óđục.
·        Bạn có thể tạo ra color bằng cách sử dụng các hằng số tĩnh trong lớp Color
int color = Color.BLUE;

·        Nếu bạn biết ARGB và biết con số đại diện cho blue bạn có thể dùng một hàm tĩnh của lớp Color
color = Color.argb(127, 255, 0, 255);

·        Một cách khác là định nghĩa một color trong XML resource file:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="mycolor">#7fff00ff</color>
</resources>

Bạn có thể tham chiếu color mà bạn đã định nghĩa bằng cách sử dụng java code
color = getResources().getColor(R.color.mycolor);

·        Hàm getResources() trả về một lớp ResourceManager của Activity hiện tại, và hàm getColor cho manager biết phải tìm color theo id nhận được

2.     Paint
·        Chứa style, color, và các thông tin khác cần thiết để vẽ đồ họa (bitmap, text, geometric shape).
·        Cài đặt color với phương thức Paint.setColor() ví dụ:
cPaint.setColor(Color.LTGRAY);

3.     Canvas
·        Đại diện cho mặt ngoài mà bạn sẽ vẽ trên nó.
·        Ban đầu canvas trống rỗng, các phương thức của lớp Canvas cho phép bạn vẽ các đường thẳng, hình chữ nhật, hình tròn, và các dạng hình học khác trên nó.
·        Trong Android, màn hình hiển thị là một Activity, nó làm chủ một View, View này làm chủ một Canvas. Bạn có thể vẽ trên canvas này bằng cách ghi đè phương thức View.onDraw(). Tham số duy nhất của phương thức này là một canvas mà bạn vẽ trên.Đây là một ví dụ:
public class Graphics extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new GraphicsView(this));
}
static public class GraphicsView extends View {
public GraphicsView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
// Drawing commands go here
}
}
4.     Path
·        Lớp Path dữ một tập hợp vector-drawing cammand như các đường thẳng, hình chữ nhật, đường cong. Dươi đây là một ví dụ định nghĩa một đường tròn:
circle = new Path();
circle.addCircle(150, 150, 100, Direction.CW);

Nó sẽ tạo ra một đường tròn tại tọa độ x = 150, y = 150 với bán kính là 100 px. Tiếp theo chúng ta sẽ sử dụng path này để vẽ một đường tròn bên ngoài và thêm một số chữ xung quan bên trong
private static final String QUOTE = "Now is the time for all " +
"good men to come to the aid of their country." ;
canvas.drawPath(circle, cPaint);
canvas.drawTextOnPath(QUOTE, circle, 0, 20, tPaint);

5.     Drawable
·        Lớp Drawable được sử dụng cho một phần tử nhìn thấy giống như bitmap hoặc solid color được dùng chỉ để hiển thị.
·        Bạn có thể kết hợp drawable với các graphic khác, hoặc có thể sử dụng chúng trên user interface widgets (background, button, view…)
·        Dawable nhận một sự đa dạng của các form:
o   Bitmap: PNG, JPEG image
o   NinePatch: một PNG có thể kéo dài. Nó được chia ra làm 9 phần. Được sử dụng làm background của resizable bitmap button.
o   Shape: Vector-drawing cammand, dựa trên lớp Path.
o   Layers: Một container cho các child drawable mà vẽ trên cũng của child khác theo z-order.
o   States: Một container mà show một trong các drawables của nó dựa trên trạng thái của nó (một bit mask). Một cách sử dụng khác là để thiết lập các tùy chọn khác nhau và focus các trạng thái cho các button.
o   Levels: Một container chỉ show duy nhất một trong các child drawable của nó dựa trên level của nó (Một phạm vi của số nguyên). Có thể sử dụng cho pin và tín hiệu kế.
o   Scale: Một container cho một child drawable mà có thế hiệu chỉnh kích thước của nó dựa trên level hiện hành. Sử dụng cho zoomable picture viewer.

Networking - Bài 1

Để có thể làm việc với mạng chương trình của bạn phải được cấp quyền như sau:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • Android sử dụng giao thức HTTP để gửi và nhận dữ liệu
  • Android có 2 loại HTTP client:
    • HttpURLConnection
    • HttpClient
  • Cả 2 loại trên đều hỗ trợ HTTPs, download, upload, tùy chỉnh timeout, IPv6 và tổng hợp connection.
Kiểm tra kết nối mạng

  • sử dụng hàm getActivityNetworkInfo() và isConnected() để kiểm tra kết nối mạng có sẵn dùng hay không
public void myClickHandler(View view) {
    ...
    ConnectivityManager connMgr = (ConnectivityManager) 
        getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        // fetch data
    } else {
        // display error
    }
    ...
}
a

Saturday, October 6, 2012

Intent trong Android



Intent:
  • Là một cấu trúc dữ liệu mô tả cách thức,đối tượng thực hiện của 1 Activity
  • Là cầu nối giữa các Activity:một ứng dụng Android gồm nhiều Activity và mỗi Activity thực hiện một nhiệm vụ khác nhau
  • Intent giống người đưa thư giúp chúng ta truyền triệu gọi cũng như truyền dữ liệu cần thiết để có thể thực hiện Activity này từ Activity khác (tương tự như di chuyển qua lại giữa các window Form)
  • Intent là khái niệm đặc trưng và then chốt của Android Platform  
Một Intent được thực hiện bởi các thành phần khác nhau như
  • Mong muốn hành động hoặc dịch vụ
  • Dữ liệu,loại thành phần nên xử lý
  • Các ý định và hướng dẫn về việc làm thế nào khởi động một activity
Intent Filter: Activity, ServiceBroadCast Receiver sử dụng Intent Filter để thông báo cho hệ thống biết các dạng Implicit Intent (cái này là gì thì tí nữa sẽ định nghĩa sau) mà nó có thể xử lý,hay nói cách khách Intent filter là bộ lọc Intent,chỉ cho phép những Intent được chỉ định đi qua nó.

Các thuộc tính của Intent:
  • Component name:tên của component mà sẽ xử lí intent (ví dụ: “com.example.project.app.MyActivity1”),khi thuộc tính này được xác định thì các thuộc tính khác sẽ thành không bắt buộc(optional)
  • Action:là một chuỗi đặt tên cho các hành động mà Intent sẽ yêu cầu thực hiện (ví dụ:Action_view,action_call…)
  • Data:là xử liệu sẽ được xử lí trong action thường được biểu diễn dưới dạng URI (ví dụ : tel:/216 555-1234 , "http://maps.google.com”, ...)
  • Category:bổ sung thông tin cho các action của Intent (ví dụ: Category_launcher thông báo sẽ thêm launcher như một ứng dụng top level)
  • Extras:chứa tất cả các cặp (key,value) do ứng dụng thêm vào để truyền qua Intent (cấu trúc Bundle)
  • Type:định dạng kiểu dữ liệu (chuẩn MIME )thường là tự xác định

Cơ chế cung cấp Intent cho các component:
  • Một Intent được thông qua đến Context.startActivity() or Activity.startActivityForResult() để khởi động một Activity hoặc sử dụng Activity hiện tại để thực hiện một hành động mới(Nó cũng có thể được truyền cho Activity.setResult() để trả về thông tin cho hoạt động này đó được gọi là startActivityForResult()).
  • Một Intent được thông qua đến Context.startService() để bắt đầu một service hoặc cung cấp chỉ dẫn mới cho một dịch vụ đang hoạt động.
  • Một Intent có thể thông qua đến Context.bindService() để có thể thiết lập kết nối giữa các component gọi điện thoại và service mục tiêu,nó có thể tùy chọn bắt đầu Service nếu nó chưa hoạt động

Intent Resolution:khi các Intent được phát ra Android sẽ tìm cách phù hợp nhất để thực hiện yêu cầu.Quyết định thực thi cái gì dựa trên mức độ mô tả của lời gọi.
  • Explicit Intent:chỉ rõ một Component cụ thể( bằng setComponent(ComponentName) hoặc setClass(Context, Class) ), nó cho biết chính xác lớp nào cần chạy. Đây là cách thông thường mà một ứng dụng bật các activity nội tại của nó khi người dùng tương tác với ứng dụng.
  • Implicit Intent :không chỉ rõ component nào. Tuy nhiên, chúng chứa đủ thông tin để hệ thống xác định các component sẵn có nào là phù hợp nhất để chạy cho intent đó.
  • Cơ chế phân giải Intent(Intent Resolution) về cơ bản là so sánh intent với các mô tả <intent-filter> trong các ứng dụng đã cài trên thiết bị.

Friday, October 5, 2012

Android - Safe and Secure

- Mọi ứng dụng chạy trong tiến trình Linux của nó.
- Phần cứng không cho phép tiến trình này truy cập vào vùng nhớ của tiến trình kia.
- Mỗi một ứng dụng đều có một user ID riêng, các ứng dụng khác không thể đọc hoặc ghi các file mà nó tạo ra.
- Việc truy cập vào một số hoạt động quan trọng bị hạn chế, bạn cần phải xin phép sử dụng chúng trong file AndroidManifest.xml. Package Manager sẽ có hoặc không cấp phép. Một vài quyền thường dùng:
+INTERNET: truy cập internet
+READ_CONTACT: đọc dữ liệu contact của người dùng
+WRITE_CONTACT: ghi dữ liệu contact của người dùng
+RECEIVE_SMS: quản lý các SMS tới
+ACCESS_COARSE_LOCATION
+ACCESS_FINE_LOCATION
- Ví dụ để quản lý tin SMS tới ta định nghĩa như sau trong file manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.android.app.myapp" >
       <uses-permission android:name="android.permission.RECEIVE_SMS" />
</manifest>
- Có thể giới hạn truy cập tới các bộ phận của toàn bộ hệ thống. Bằng cách sử dụng XML tag trong AndroidManifest.xml bạn có thể giới hạn người có thể khởi động activity, gắn vào một service, broadcast các intent để nhận hoặc truy cập dữ liệu trong một content provider.

Android - Using Resources

- Resource là các tài nguyên cục bộ như text string, bitmap, hoặc các thành phần noncode mà chương trình cần để chạy
- Tại thời điểm build time tất cả tài nguyên sẽ được biên dịch vào trong chương trình
- Trong android bạn có thể tạo và lưu trữ tài nguyền trong thư mục res của project.
- Bộ biên dịch tài nguyên của android sẽ xử lý các tài nguyên theo các thư con mà chúng chưa trong và theo định dạng của tài nguyên đó. Ví dụ: PNG, JPG định dạng bitmaps phải lưu trữ ở thư mục res/drawable, tập tin XML mô tả giao diện lưu trữ ở res/layout
- Bộ biên dịch sẽ nén và đóng gói các tài nguyên sau đó tạo ra class R chứa các định danh dùng để tham chiếu tới tài nguyên trong chương trình.

Android - Building in Blocks

Activities
- Một activity là một màn hình giao diện người dùng.
- Một chương trình có thể định nghĩa nhiều actitity để xử lý các giai đoạn khác nhau của chương trình

Intent
- Là cơ chế mô tả một hành động cụ thể
- Ví dụ: chúng ta có intent để "send an email". Nếu ứng dụng của bạn cần gửi một email, bạn sẽ gọi intent này. Hoặc nếu bạn viết một chương trình gửi email, bạn có thể đăng ký một activity để xử lý intent này.

Services
- Là một tiến trình chạy trong chế độ background, không cho phép người dùng tương tác trực tiếp với nó.

Content Providers
- Là một tập dữ liệu gói gọn trong một API tùy biến cho phép đọc và ghi.
- Là một cách để chia sẻ dữ liệu global giữa các ứng dụng
- Ví dụ: google cung cấp một content provider cho các contact, tất cả các thông tin như: tên, địa chỉ, số điện thoại... có thể được chia sẻ cho bất cứ ứng dụng nào cần dùng đến.