2010. 12. 3. 20:44

Intent에 의한 사진뷰어, 갤러리, 카메라 제어





Intent는 정말 보면 기존 어플들의 기능을 재사용할 수 있도록 해주는 고마운 기능인것 같습니다. 
사진보기, 갤러리, 카메라는 Intent를 활용하여서 제어를 할 수 있기 때문에 또다시 이런 기능을 또 만들지 않도록 할 수 있고 개발기간을 단축할 수 있으며, 사용자에게도 익숙한 UI 이기때문에 효율성인 측면에서 대단히 좋은 기능이 아닐 수 없습니다. 따라서 이 세가지 기능에 대해서 정리를 해보았습니다.

1. 갤러리 관련 제어
 - 내장되어 있는 갤러리를 호출하여 사진을 선택 후 내가 어떤 사진을 선택했는지 URI로 가지고 데이터를 설정한다. 
 
 - 갤러리 리스트뷰 호출 
Intent i = new Intent(Intent.ACTION_PICK);
i.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
i.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // images on the SD card.
// 결과를 리턴하는 Activity 호출 startActivityForResult(i, REQ_CODE_PICK_PICTURE);
 - 갤러리 리스트뷰에서 사진 데이터를 가져오는 방법
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQ_CODE_PICK_PICTURE) {
if (resultCode == Activity.RESULT_OK) { 
ImageView img = (ImageView)findViewById(R.id.image);
img.setImageURI(data.getData()); // 사진 선택한 사진URI로 연결하기 
}
}


2. 사진뷰어 호출
// 개별 이미지에 대한 URI 생성
// ex>uri = content://media/external/images/media/4  --> 4 = id
Uri uri = ContentUris.withAppendedId( Images.Media.EXTERNAL_CONTENT_URI, id);  // id값은 사진고유 ID
Intent intend = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intend);


3. 카메라 호출
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
2010. 10. 22. 13:50

manifest-element




<manifest>

syntax:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
         
package="string"
         
android:sharedUserId="string"
         
android:sharedUserLabel="string resource"
         
android:versionCode="integer"
         
android:versionName="string"
         
android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
    . . .
</manifest>

contained in:
none

must contain:
<application>
can contain:
<instrumentation>
<permission>
<permission-group>
<permission-tree>
<uses-configuration>
<uses-permission>

<uses-sdk>

description:
The root element of the AndroidManifest.xml file. It must contain an <application> element and specify xlmns:android and package attributes.
attributes:
xmlns:android
Defines the Android namespace. This attribute should always be set to "http://schemas.android.com/apk/res/android".
package
A full Java package name for the application. The name should be unique. The name may contain uppercase or lowercase letters ('A' through 'Z'), numbers, and underscores ('_'). However, individual package name parts may only start with letters. For example, applications published by Google could have names in the form com.google.app.application_name.

The package name serves as a unique identifier for the application. It's also the default name for the application process (see the <application> element's process process attribute) and the default task affinity of an activity (see the <activity> element's taskAffinity attribute).

android:sharedUserId
The name of a Linux user ID that will be shared with other applications. By default, Android assigns each application its own unique user ID. However, if this attribute is set to the same value for two or more applications, they will all share the same ID — provided that they are also signed by the same certificate. Application with the same user ID can access each other's data and, if desired, run in the same process.
android:sharedUserLabel
A user-readable label for the shared user ID. The label must be set as a reference to a string resource; it cannot be a raw string.

This attribute was introduced in API Level 3. It is meaningful only if the sharedUserId attribute is also set.

android:versionCode
An internal version number. This number is used only to determine whether one version is more recent than another, with higher numbers indicating more recent versions. This is not the version number shown to users; that number is set by the versionName attribute.

The value must be set as an integer, such as "100". You can define it however you want, as long as each successive version has a higher number. For example, it could be a build number. Or you could translate a version number in "x.y" format to an integer by encoding the "x" and "y" separately in the lower and upper 16 bits. Or you could simply increase the number by one each time a new version is released.

android:versionName
The version number shown to users. This attribute can be set as a raw string or as a reference to a string resource. The string has no other purpose than to be displayed to users. The versionCode attribute holds the significant version number used internally.
android:installLocation
The default install location for the application.

The following keyword strings are accepted:

Value Description
"internalOnly" The application must be installed on the internal device storage only. If this is set, the application will never be installed on the external storage. If the internal storage is full, then the system will not install the application. This is also the default behavior if you do not define android:installLocation.
"auto" The application may be installed on the external storage, but the system will install the application on the internal storage by default. If the internal storage is full, then the system will install it on the external storage. Once installed, the user can move the application to either internal or external storage through the system settings.
"preferExternal" The application prefers to be installed on the external storage (SD card). There is no guarantee that the system will honor this request. The application might be installed on internal storage if the external media is unavailable or full, or if the application uses the forward-locking mechanism (not supported on external storage). Once installed, the user can move the application to either internal or external storage through the system settings.

Note: By default, your application will be installed on the internal storage and cannot be installed on the external storage unless you define this attribute to be either "auto" or "preferExternal".

When an application is installed on the external storage:

  • The .apk file is saved to the external storage, but any application data (such as databases) is still saved on the internal device memory.
  • The container in which the .apk file is saved is encrypted with a key that allows the application to operate only on the device that installed it. (A user cannot transfer the SD card to another device and use applications installed on the card.) Though, multiple SD cards can be used with the same device.
  • At the user's request, the application can be moved to the internal storage.

The user may also request to move an application from the internal storage to the external storage. However, the system will not allow the user to move the application to external storage if this attribute is set to internalOnly, which is the default setting.

Introduced in: API Level 8.

introduced in:
API Level 1 for all attributes, unless noted otherwise in the attribute description.

see also:
App Install Location
<application>
2010. 10. 13. 16:02

C2DM





C2DM (Cloud to Device Messaging) 은 인터넷에서 안드로이드 폰에 메시지를 보낼수 있는 기술이다.

인터넷에 최신 정보가 올라와 있는 데도 휴대폰이 서버에 접속해서 알아 보기 전 까지는
최신 정보가 올라와 있는 줄 모른다. 그 이전에는 일일이 휴대폰에서 특정 시간 간격으로
서버에 접속해 알아 보아야 했다. 이럴 경우 문제가 되는 것은 배터리 소모가 많고 네트웍
트래픽이 증가 한다는 문제점이 있다.

이를 위한 해결책으로 C2DM 이 나왔다.

이 기술을 사용하기 위해서는 안드로이드 2.2 가 설치된 폰에서
마켓에 등록된 앱을 사용해야 한다. 아직은 정식 릴리즈 되지 않았기
때문에 등록 신청한 후 시험해 볼 수 있다.

먼저 전체적인 그림을 보면 다음과 같은 구성 요소들이 있다.

1. 안드로이드 폰
2. 어플리케이션 서버
3. C2DM 서버

안드로이드 폰에서 푸시 기능을 사용하고 싶다면 다음과 같은 절차가 필요하다.

1. 안드로이드 폰에서 푸시 기능 활성화 하기
2. 어플리케이션 서버에서 C2DM 서버로 메시지 보내기
3. C2DM 서버에서 해당 안드로이드 폰으로 메시지 전달하기

안드로이드 폰 사용자들이 마켓에서 앱을 다운로드 받아 설치 할 때
앱이 C2DM 기능을 가지고 있다는 정보를 받고 이 기능을 사용할지 않을지를
선택 할 수 있다.

실제로 C2DM 을 사용하는 앱을 개발하는 절차를 알아보자

1. AndroidManifest.xml
   1.1. Permission
- RECEIVE
- C2D_MESSAGE
- INTERNET
   1.2. Receiver
1.2.1. intent filters
- RECEIVE
- REGISTRATION

2. C2DM 에 등록하기
   2.1. REGISTER 인텐트 생성 with sender and app
   2.2. startService

3. 등록 결과 처리하기

   단계 2 에서 REGISTER 인텐트를 날리면 등록 ID 값을 가진 인텐트를 받게 되는데
   이 인텐트를 받아 어플리케이션 서버에 내 등록 ID 를 전달하여야 한다.

4. 메시지 처리 하기

   등록이 성공하면 어플리케이션 서버는 언제든지 메시지를 보낼수 있는데
   메시지는 크기는 1024 바이트로 제한된다. 따라서 전체 데이타를 다 보내기 보다는
   어플리케이션에게 새로운 데이타가 있으니 접속해서 업데이트 하라는 메시지만
   보내야 한다.

어플리케이션 서버가 C2DM 서버에게 메시지를 보내기 위해서는 HTTP POST 를
https://android.apis.google.com/c2dm/send 를 사용하여 보내면 된다.

원문 http://joejeon.tistory.com/310