Android/App개발2011. 5. 11. 11:02

Intent.ACTION_SEND를 이용하여 Email, MMS 앱에 파라메터를 번들형태로 넘겨서 해당 액티비티를 호출하는 것이 가능하다.

Email의 경우 아래와 같이 하면 된다.


Intent i=new Intent(Intent.ACTION_SEND); 

i.addCategory(Intent.CATEGORY_DEFAULT); 

    

// for EMail
// mimetype

i.setType("text/plain");
i.putExtra(Intent.EXTRA_SUBJECT, "제목입니다."); 

i.putExtra(Intent.EXTRA_TEXT, "본문이구요 ....");

i.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"user1@website.com"}); 

i.putExtra(Intent.EXTRA_CC, new String[]{"user_cc1@website.com"user_cc2@website.com"}); 

i.putExtra(Intent.EXTRA_BCC, new String[]{"user_bcc1@website.com"}); 

// 파일 첨부
i.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/mic_rec3.wav"));

// 앱선택 박스를 띄움.

startActivity(Intent.createChooser(i, "How do you want to send message?"));


MMS의 경우는 아래와 같이 Extra정보를 설정한다.    

// for MMS

i.putExtra("address", "07011111111;01022222222");

i.putExtra("exit_on_sent", true);

i.putExtra("sms_body", "MMS 테스트입니다."); 

startActivity(Intent.createChooser(i, "How do you want to send message?"));


앱선택박스를 띄우지 않고 바로 특정 앱(MMS, GMail)으로 바로 연결되도록 하려면 해당하는 액티비티 Component를 Intent에 등록하면 된다.

// com.google.android.gm 패키지의 ComposeActivityGmail 액티비티를 명시적으로 기입해도 될듯~!

i.setComponent(new ComponentName("com.google.android.gm","com.google.android.gm.ComposeActivity"));


그러나 위와 같이 하면 permission에러가 나면서 해당 액티비티가 호출되지 않는다.
권한문제를 피해가기 위해 Intent.createChooser()를 이용하여 해당 액티비티로 연결하도록 되어 있다.

이를 피하기 위해서는 권한 문제가 없는 자체적인 Mail client나 MMS client를 직접 작성해야 할것으로 보인다.
그러나 이 문제도 권한문제로 인해 구현이 불가할 수 있다.



Posted by 삼스
Android/App개발2009. 7. 26. 19:19
기존 액티비티로 하여금 아직 생각해보지 못한 기능의 이점을, 프로젝트를 수정하거나 다시 컴파일할 필요없이 새로운 applicaton component를 통해 취할 수 있도록 해주는 플러그인 모델을 제공한다.

이 방법은 "런타임 메뉴 추가"기능을 의미한다.

<activity android:name=".NostromoController">
  <intent-filter android:label="궤도로부터의 핵 공격">
    <action android:name="com.pad.nostromo.NUKE_FROM_ORBIT"/>
    <data android:mimeType="vnd.moonbase.cursor.item/*/>
    <category android:name="android.intent.category.ALTERNATIVE"/>
    <category android:name="android.intent.category.SELECTED_ALTERNATIVE"/>
</activity>

위 action을 또 다른 액티비티의 메뉴에서 동적으로 사용할 수 있도록 만들 수 있다.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);

Intent intent = new Intent();
intent.setData(MoonBaseProvider.CONTENT_URI);
intent.addCategory(Intent.CATEGORY_SELECTED_ALTERNATIVE);

int menuGroup = 0;
int menuItemId = 0;
int menuItemOrder = Menu.NONE;

ComponentName caller = getComponentName();

Intent[] specificIntents = null;
MenuItem[] outSpecificItems = null;

menu.addIntentOptions(menuGroup,
                               menuItemId,
                               menuItemOrder,
                               caller,
                               specificIntents,
                               intent,
                               Menu.FLAG_APPEND_TO_GROUP,
                               outSpecificItems);
return true;
}


** Broadcast Intent **
  인텐트는 액티비티를 호출하는데에만 사용하는 것이 아니라 콤포넌트들간에 메시지를 전달하는데 사용될 수 있다. 어플리케이션내에 브로드캐스트수신자를 장착하여 특정 방송메세지에 귀기울이도록 할 수 있다.

  // 방송하기
  1. Intent 생성
    Intent intent = new Intent(NEW_LIFEFORM_DELETED);
    intent.putExtra("lifeformName", lifeformType);
    intent.putExtra("longitude", currentLongitude);
    intent.putExtra("latitude", currentLatitude);
  2. send
    sendBroadcast(intent);

  // 방송듣기
  1. BroadcastReceiver 생성
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;

  public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Content context, Intent intent) {
      // TODO :수신한 방송에 대해 처리를 한다.
    }
  }
 2. AndroidManifest.xml에 수신자를 등록한다.
  <receiver android:name=".LifeformDeletedBroadcastReceiver">
    <intent-filter>
      <action android:name="com.paad.action.NEW_LIFEFORM"/>
    </intent-filter>
  </receiver>
 3. 또는 code상에서 수신자를 등록하거나 해재할 수 있다. 이 처럼 동적으로 액티비티가 활성화되어 있을경우에만 수신할 수 있도록 하는 제어가 가능하다.
    //등록하기
    IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED);
    LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver();
    registerReceiver(r, filter);

    // 해재하기
    unregisterReceiver( r );

안드로이드 시스템에서 정의되어 있는 방송의 종류는 아래와 같다.
  ACTION_BOOT_COMPLETED
  ACTION_CAMERA_BUTTON
  ACTION_DATE_CHANGED, ACTION_TIME_CHANGED
  ACTION_GTALK_SERVICE_CONNECTED, ACTION_GTALK_SERVICE_DISCONNECTED
  ACTION_MEDIA_BUTTON
  ACTION_MEDIA_EJECT
  ACTION_MEDIA_MOUNTED, ACTION_MEDIA_UNMOUNTED
  ACTION_SCREEN_OFF, ACTION_SCREEN_ON
  ACTION_TIMZONE_CHANGED
  // ... http://developer.android.com/reference/android/content/Intent.html


Posted by 삼스