본 내용은 Android Devloper site 의 내용을 발췌한 내용입니다.


인텐트를 활용한 방식이 어플리케이션간의 데이터 공유방식중 가장 일반적인 방식이다.
Android에서 다른 앱으로 데이터를 전달하기 위해서는 ACTION_SEND 엑션을 활용한다. 

데이터를 공유 하는 방법중에 가장 좋은 방법은  ActionBar 에서 ShareActionProvider 를 추가 하여 공유하는 방법이다.(https://developer.android.com/training/sharing/shareaction.html)


TEXT 컨텐츠 보내기

  • ACTION_SEND 엑션을 통해서 바로 다른 앱으로 데이터를 전달하는 방법이다. 예를 들어서 어떤 글이나 URL을 E-mail 또는 소셜네트워킹 앱으로 공유하는 경우를 생각해 보자
          데이터를 보내는 앱에서는 아래와 같이 전달한다.
Intent sendIntent = new Intent();
sendIntent
.setAction(Intent.ACTION_SEND);
sendIntent
.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent
.setType("text/plain");
startActivity
(sendIntent);

  • 위와같이 인텐트를 실행했을때 설치되어 있는 어플리케이션중에 ACTION_SEND필터와 “text/plain”과 같은 MimeType을 셋팅한 어플리케이션이 있을 경우 안드로이드는 해당 어플리케이션을 실행하게 된다. 한개 이상의 어플리케이션이 매칭될경우 아래와 같이 앱을 선택하는 다이얼 로그가 나타난다.
            



  • 아래와 같이 위 소스를 수정하여 Intent.createChooser()를 명시적으로 호출하는경우 몇가지 장점을 얻을 수 있다.
  • Intent sendIntent = new Intent();
    sendIntent
    .setAction(Intent.ACTION_SEND);
    sendIntent
    .putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
    sendIntent
    .setType("text/plain");
    startActivity
    (Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));

    • 이전에 선택한 앱이 있더라도 앱을 선택하는 창이 나타나게 된다.
    • 매칭되는 앱이 없는 경우에 안드로이드 시스템 메세지가 보이게 된다.
    • Chooser 다이얼로그의 제목을 지정 할 수 있다.



Binary 컨텐츠 보내기

바이너리 데이터를  ACTION_SEND 을 활용하여 전송하기 위해서는 적절한 MIME타입 지정과  EXTRA_STREAM에 uri 를 지정해야 한다. 일반적으로 이미지를 공유하는 방식이지만 기본적으로 모든 바이너리 파일에 대해서 적용 가능하다.

Intent shareIntent = new Intent();
shareIntent
.setAction(Intent.ACTION_SEND);
shareIntent
.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent
.setType("image/jpeg");
startActivity
(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
  •  "*/*” MIME을 활용 할 수 있다. 그러나 이경우에는 일반적인 데이타 스트림을 다루는 엑티비티에게만 매칭된다.

  • 데이터를 받는 어플리케이션에서는 Uri가 가르키는 데이터에 접속하기 위해서 권한이 필요하다. 추천하는 방법은 다음과 같다. 
    • 데이터를  ContentProvider 에 저장하고 ContentsProvider를 통해서 데이터 접속 하도록 한다.
    • 시스템의  MediaStore 를 활용한다. 미디어 스토어는 비디오와 오디오를 위해서 만들어 졌지만 안드로이드 3.0 이상에서는 non-media 타입에 대해서도 지원을 한다. MediaStore에 저장을 하면 content:// 와 같은 형태로 접근이 가능하다(단, 미디어스캔이 끝난 이후에). MediaStore에 저장되면 모든 앱에서 접근이 가능하다.




Multiple 컨텐츠 보내기

multiple 컨텐츠를 공유하기 위해서는  ACTION_SEND_MULTIPLE  액션을 사용해야 한다. MIME 타입은 공유하는 컨텐츠 종류에 따라 달라진다. 예를 들어  3개의  JPEG  이미지를 공유하는 경우 타입은 여전희  "image/jpeg” 이다.  또는 여러개의 이미지 종류가 섞여있는 경우 "image/*” 로 설정하면 어떠한 타입의 이미지가 와도 핸들링이 가능하다.   "*/*” 를 사용한다면 모든 타입에 대해서 공유를 할 수 있음을 의미한다.이러한 경우에는 받는쪽에서 데이터 타입에 따른 핸들링 하는 부분이 보다 추가 되어야 한다.(타입이 명확하지 않은 부분에 대한 verify 필요함)

ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris
.add(imageUri1); // Add your image URIs here
imageUris
.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent
.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent
.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent
.setType("image/*");
startActivity
(Intent.createChooser(shareIntent, "Share images to.."));














참고 : 다른앱으로 데이터 전달하기


본 내용은 Android Devloper site 의 내용을 발췌한 내용입니다.


1. 다른 App으로부터 ACTION_SEND 인텐트를 받기 위해서 App의 Manifest 파일에 <intent-filter> 엘리먼트를 추가 한다.
<intent-filter>를 추가 함으로 인해서 앱이 다른 앱으로부터 데이터를 받을 수 있음을 나타낸다. 다른 앱이 쉐어 기능을 활용할 경우 , 동일한 mimeType 으로 지정되어 있으면 공유 리스트에 나타나게 된다.
<activity android:name=".ui.MyActivity" >

   
<intent-filter>

       
<action android:name="android.intent.action.SEND" />

       
<category android:name="android.intent.category.DEFAULT" />

       
<data android:mimeType="image/*" />

   
</intent-filter>

   
<intent-filter>

       
<action android:name="android.intent.action.SEND" />

       
<category android:name="android.intent.category.DEFAULT" />

       
<data android:mimeType="text/plain" />

   
</intent-filter>

   
<intent-filter>

       
<action android:name="android.intent.action.SEND_MULTIPLE" />

       
<category android:name="android.intent.category.DEFAULT" />

       
<data android:mimeType="image/*" />

   
</intent-filter>
</activity>

2. 다른 앱으로부터  전달받은 데이터가 실행될 때는 getIntent() 로  ACTION_SEND Intent로 받은 내용에 따라서 핸들링하는 부분을 다음소스와 같이 추가 해야한다.
홈에서 앱을 띄우는 경우와 다른앱에서 ACTION_SEND 로 전달되는 경우 각각에 따른 핸들링이 필요하다.
void onCreate (Bundle savedInstanceState) {

   
...

   
// Get intent, action and MIME type

   
Intent intent = getIntent();

   
String action = intent.getAction();

   
String type = intent.getType();


   
if (Intent.ACTION_SEND.equals(action) && type != null) {

       
if ("text/plain".equals(type)) {

            handleSendText
(intent); // Handle text being sent

       
} else if (type.startsWith("image/")) {

            handleSendImage
(intent); // Handle single image being sent

       
}

   
} else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {

       
if (type.startsWith("image/")) {

            handleSendMultipleImages
(intent); // Handle multiple images being sent

       
}

   
} else {

       
// Handle other intents, such as being started from the home screen

   
}

   
...
}


void handleSendText(Intent intent) {

   
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);

   
if (sharedText != null) {

       
// Update UI to reflect text being shared

   
}
}


void handleSendImage(Intent intent) {

   
Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);

   
if (imageUri != null) {

       
// Update UI to reflect image being shared

   
}
}


void handleSendMultipleImages(Intent intent) {

   
ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);

   
if (imageUris != null) {

       
// Update UI to reflect multiple images being shared

   
}
}




본 내용은 Android Devloper site 의 내용을 발췌한 내용입니다.


- 안드로이드의 디바이스 화면은 size 와 density 두가지 프로퍼티에 의해서 정해진다. 
. 4가지 일반적인 size :small , normal , lage, xlarge 
. 4가지 일반적인 density : low(ldpi), medium(mdpi), high(hdpi), extra high(xhdpi)
- 각 화면마다 다른레이아웃과 비트맵을 활용하기 위해서는 디렉토리를 분리하여 리소스들을 위치시켜야 한다.
- 또한 UX를 위해서는 화면의 방향(가로모드,세로모드)에 따라서 레이아웃을 수정해줘야 한다.


Create Different Layouts


UX를 최적화 하기 위해서는 사이즈에 따라서 각기 다른 레이아웃을 제공해야 한다. 각 레이아웃은 적절한 리소스 디렉토리에 저장되어야 하며, 이름은 -<screen_size> 를 뒤에 붙이도록 한다. .예를 들어 large 사이즈의 화면의 레이아웃은 다음과 같다. res/layout-large/.

Note: 안드로이드는 화면을 적절하기 맞추기 위해서 자동으로 레이아웃을 조정한다. 따라서 화면의 크기가 달라짐에 따라서 그안에 있는 UI요소의 절대적인 크기에 대해서는 걱정할 필요가 없다. 그대신 UX에 영향을 미치는 레이아웃의 구조에 초점을 맞춰야 한다. (예를들어 연관되어 있는 뷰들간의 사이즈나 위치등을 고려해야 한다)



예를들어 ,이 프로젝트에는 기본 레이아웃과 큰화면에서 대응되는 레이아웃이 존재한다.

MyProject/
    res/
        layout/
            main.xml
        layout-large/
            main.xml


파일이름은 반드시 같아야 하지만 컨텐츠는 다른 화면의 사이즈에 맞게  UI 를 제공하기 위해서 달라질 수 있다.

일반적으로 어플리케이션의 레이아웃 파일은 다음과 같이 참조 (레이아웃과 동일한 이름으로 지정)

@Override
protected void onCreate(Bundle savedInstanceState) {
    
super.onCreate(savedInstanceState);
     setContentView
(R.layout.main);
}

시스템은 당신의 앱이 실행되면 스크린의 사이즈에 맞춰서 크기에 해당하는 디렉토리의 레이아웃을 셋팅합니다. .안드로이드가 적절한 리소스를 선택하는 방법에 대해서는 다음 가이드를 참조한다. ( Providing Resources guide)


다른 예제는 화면방향(가로모드)에 대한 레이아웃 예제이다.

MyProject/
    res/
        layout/
            main.xml
        layout-land/
            main.xml


기본적으로 layout/main.xml 파일은 세로모드로 동작한다.

가로모드에서 특정한 레이아웃을 제공하고 싶다면, 레이아웃 폴더명에 large 와 land 구분자를 넣어주면 된다.

MyProject/
    res/
        layout/              # default (portrait)
            main.xml
        layout-land/         # landscape
            main.xml
        layout-large/        # large (portrait)
            main.xml
        layout-large-land/   # large landscape
            main.xml


Create Different Bitmaps

일반적으로 해상도에 따라서도  알맞은 비트맵을 제공해야 한다. 

이런 비트맵을 생성하기 위해서는 벡터형식의 raw리소스로 만들어야 하며,  아래 종류에 맞는 이미지를 생성해야 한다.

    • xhdpi: 2.0
    • hdpi: 1.5
    • mdpi: 1.0 (baseline)
    • ldpi: 0.75

이것은  200x200 는  xhdpi 디바이스를 위해서 , 150x150 은 hdpi 디바이스를 위해서 ,  100x100은  mdpi 디바이스를 위해서 ,  75x75 은  ldpi 디바이스를 위해서 각각 생성해야 됨을 의미한다

그리고 각각의 파일은 drawble 리소스 폴더에 적절한 위치에 저장해야 한다.

MyProject/
    res/
        drawable-xhdpi/
            awesomeimage.png
        drawable-hdpi/
            awesomeimage.png
        drawable-mdpi/
            awesomeimage.png
        drawable-ldpi/
            awesomeimage.png

 @drawable/awesomeimage 에 접근하면 시스템은 화면의 해상도에 따라서 비트맵을 선택하여 제공한다.


+ Recent posts