Hatena::Groupxn--272ax3f

Android アプリ開発勉強会 #4

Android アプリ開発勉強会 #4

目次

本日の内容

Sharing Simple Data | Android Developers


Sending Simple Data to Other Apps | Android Developers

Sending Simple Data to Other Apps | Android Developers

  • Intent に ACTION_SEND のような動作を定義する
  • データと型を指定して渡してやればあとはいいように扱ってくれる。選択肢をきいたりいきなり起動したり
  • 自分のActivityがどういうデータを受け付ける、という情報を広告

Send Text Content

  • URLを送ったりできます
  • ACTION_SEND と text/plain にマッチする人がいたら受け取ってくれる。複数いたら選択画面が出る

http://developer.android.com/images/training/sharing/share-text-screenshot.png

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);
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)));
  • つけてないと android.content.ActivityNotFoundException 投げられて死んだ
        Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.SEND typ=text/html flg=0x1 (has clip) (has extras) }
  • 標準的なオプションをつけることができるけど対応してないと無視される:EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT
  • 自分で定義もできる(前回やった感じで)
  • Gmail は EXTRA_EMAIL は EXTRA_CC に String[] とか要求する。こういうのどうやって調べるんだろう

Send Binary Content

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)));

Send Multiple Pieces of Content

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.."));

Receiving Simple Data from Other Apps | Android Developers

Receiving Simple Data from Other Apps | Android Developers

受け取る方です。

Update Your Manifest

  • <intent-filter> に書いて受け取れるようにする
<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>

Handle the Incoming Content

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
    }
}

Adding an Easy Share Action | Android Developers

Adding an Easy Share Action | Android Developers

http://developer.android.com/images/ui/actionbar-shareaction.png

Update Menu Declarations

  • android:actionProviderClass を定義してやる
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_item_share"
        android:showAsAction="ifRoom"
        android:title="Share"
        android:actionProviderClass="android.widget.ShareActionProvider" />
    ...
</menu>

Set the Share Intent

  • さっきやったのと同じ感じで Intent を投げる
  • Activity / Fragment に配置した MenuItem で MenuItem.getActionProvider を呼ぶと ShareActionProvider が取得できる
  • setShareIntent() してやるといいように投げてくれる
  • intent を持っててくれる。変更したかったら途中で更新してやる
private ShareActionProvider mShareActionProvider;
...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate menu resource file.
    getMenuInflater().inflate(R.menu.share_menu, menu);

    // Locate MenuItem with ShareActionProvider
    MenuItem item = menu.findItem(R.id.menu_item_share);

    // Fetch and store ShareActionProvider
    mShareActionProvider = (ShareActionProvider) item.getActionProvider();

    // Return true to display menu
    return true;
}

// Call to update the share intent
private void setShareIntent(Intent shareIntent) {
    if (mShareActionProvider != null) {
        mShareActionProvider.setShareIntent(shareIntent);
    }
}