2013년 4월 24일 수요일

[Android] Action Bar ShareActionProvider( 공유 )

ShareActionProvider 

ShareActionProvider는 공유를 위한 Provider입니다. 데이터를 공유할수 있고, 만약 overflow 메뉴에 배치된다면 서브 메뉴에서 공유 activity들을 보여 줍니다.
ShareActionProvider는 ActionProvider를 상속 받고 있는 클래스 이며, Action Bar에서 공유하는 기능을 담당하고, 간단하게 공유를 사용 할 수 있게 해줍니다.

이번 포스팅에서는 Open Source 중 ActionBarShareActionProviderActivity에 대해 살펴 볼려고 합니다.
<menu xmlns:android=”http://schemas.android.com/apk/res/android”>
    <item android:id=”@+id/menu_item_share_action_provider_action_bar”
        android:showAsAction=”always”
        android:title=”@string/btn_api_provider_share”
        android:actionProviderClass=”android.widget.ShareActionProvider” />

    <item android:id=”@+id/menu_item_share_action_provider_overflow”
        android:showAsAction=”never”
        android:title=”@string/btn_api_provider_share”
        android:actionProviderClass=”android.widget.ShareActionProvider” />
</menu>

이전 포스팅한 Action Bar ActionProvider와 같은 구조로 되어 있습니다. 다만 한가지 차이점은 ActionProvider를 사용하기 위해 설정해 줘야 했던 android:actionProviderClass의 경로가 안드로이드에서 기본으로 제공하고 있는 android.widget.ShareActionProvider로 설정해야 됩니다. 당연한 말이지만 android.widget.ShareActionProvider는 ShareActionProvider의 경로 입니다. Action Bar ActionProvider포스팅에서는 직접 ActionProvider를 상속받아 구현한 클래스가 있었으므로 ActionProvider를 상속받은 클래스의 경로를 사용 했었습니다. 상단 item 의 android:showAsAction 값은 "always"이며 하단 item의 android:showAsAction 값은 "never"입니다. "always"는 항상 ActionBar에 보여진다는 뜻이며 "never" Action Bar에 보여지지 않는다는 뜻입니다.
public class ActionBarShareActionProviderActivity extends Activity {
 private static final String TAG = "ActionBar_Api_Provider_Share";
 private static final String SHARED_FILE_NAME = "shared.png";

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  copyPrivateRawResuorceToPubliclyAccessibleFile();
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // TODO Auto-generated method stub
  getMenuInflater().inflate(R.menu.action_bar_share_action_provider, menu);
  
  MenuItem actionitem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
  ShareActionProvider actionProvider = (ShareActionProvider) actionitem.getActionProvider();
  actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
  actionProvider.setShareIntent(createShareIntent());
  
  MenuItem overflowItem = menu.findItem(R.id.menu_item_share_action_provider_overflow);
  ShareActionProvider overflowprovider = (ShareActionProvider) overflowItem.getActionProvider();
  overflowprovider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
  overflowprovider.setShareIntent(createShareIntent());
  return true;
 }

 private Intent createShareIntent() {
  Intent shareIntent = new Intent(Intent.ACTION_SEND);
  shareIntent.setType("image/*");
  Uri uri = Uri.fromFile(getFileStreamPath("shared.png"));
  shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
  return shareIntent;
 }

 private void copyPrivateRawResuorceToPubliclyAccessibleFile() {
  InputStream is = null;
  OutputStream os = null;
  try {
   is = getResources().openRawResource(R.raw.robot);
   os = openFileOutput(SHARED_FILE_NAME, Context.MODE_APPEND);
   byte[] buffer = new byte[1024];
   int length = 0;
   while ((length = is.read(buffer)) > 0) {
    os.write(buffer, 0, length);
   }
  } catch (Exception e) {
   // TODO: handle exception
   Log.e(TAG, "Exception : " + e);
  } finally {
   try {
    is.close();
    os.close();
   } catch (Exception e2) {
    // TODO: handle exception
    Log.e(TAG, "Exception : " + e2);
   }
  }
 }
}
copyPrivateRawResuorceToPubliclyAccessibleFile() 메서드는 raw 폴더안의 robot.png 파일을 device안에 저장하는 간단한 소스 입니다.
ShareActionProvider를 사용 할때는 onCreateOptionsMenu(Menu menu)에서 이미 ActionProvider를 상속받고 있는 ShareActionProvider 클래스를 사용하면 됩니다.
MenuItem으로 가져온 Menu의 item을 ShareActionProvider로 가져온 후 setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);를 통해 공유 기록을 저장할 파일 이름을 설정하고 setShareIntent로 공유 할 앱들을 설정한 후 호출하면 된다.(DEFAULT_SHARE_HISTORY_FILE_NAME가 기본)


참조

댓글 없음:

댓글 쓰기