From 70645e363e8601550468b726251f4f52f383b9fc Mon Sep 17 00:00:00 2001 From: Scott Main Date: Tue, 13 Dec 2011 16:06:16 -0800 Subject: [PATCH] Docs: Add class for Sharing Content Change-Id: I078a02d952e652c16f84e1b3f7613f3dc9364c97 --- .../sharing/share-text-screenshot.png | Bin 0 -> 33210 bytes docs/html/training/sharing/index.jd | 46 +++++ docs/html/training/sharing/receive.jd | 149 ++++++++++++++ docs/html/training/sharing/send.jd | 194 ++++++++++++++++++ docs/html/training/sharing/shareaction.jd | 115 +++++++++++ 5 files changed, 504 insertions(+) create mode 100644 docs/html/images/training/sharing/share-text-screenshot.png create mode 100644 docs/html/training/sharing/index.jd create mode 100644 docs/html/training/sharing/receive.jd create mode 100644 docs/html/training/sharing/send.jd create mode 100644 docs/html/training/sharing/shareaction.jd diff --git a/docs/html/images/training/sharing/share-text-screenshot.png b/docs/html/images/training/sharing/share-text-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..089221ccace64e97ca5d78e6145e4bd132f54143 GIT binary patch literal 33210 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

J>fd2*LgCN@REm< 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

ZiibG2k;Qt2~x=5hL83ZVCj74hdXkLJz0 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 SLwE@Ir6i{=TOn;8{C@!dV(Z!f literal 0 HcmV?d00001 diff --git a/docs/html/training/sharing/index.jd b/docs/html/training/sharing/index.jd new file mode 100644 index 0000000000000..cb133c393c419 --- /dev/null +++ b/docs/html/training/sharing/index.jd @@ -0,0 +1,46 @@ +page.title=Sharing Content + +trainingnavtop=true +startpage=true +next.title=Sending Content to Other Apps +next.link=send.html + +@jd:body + +

+
+ + +

Dependencies and prerequisites

+ + +
+
+ + +

One of the great things about Android applications is their ability to communicate and +integrate with each other. Why reinvent functionality that isn't core to your application when it +already exists in another application?

+ +

This class shows some common ways you can send and receive content between +applications using {@link android.content.Intent} APIs and the {@link +android.view.ActionProvider}.

+ + +

Lessons

+ +
+
Sending Content to Other Apps
+
Learn how to set up your application to be able to send text and binary data to other +applications with intents.
+ +
Receiving Content from Other Apps
+
Learn how to set up your application to receive text and binary data from intents.
+ +
Adding an Easy Share Action
+
Learn how to add a "share" action item to your action bar.
+
diff --git a/docs/html/training/sharing/receive.jd b/docs/html/training/sharing/receive.jd new file mode 100644 index 0000000000000..b2cac304325d0 --- /dev/null +++ b/docs/html/training/sharing/receive.jd @@ -0,0 +1,149 @@ +page.title=Receiving Content from Other Apps +parent.title=Sharing Content +parent.link=index.html + +trainingnavtop=true +previous.title=Sending Content to Other Apps +previous.link=send.html +next.title=Adding an Easy Share Action +next.link=shareaction.html + +@jd:body + +
+
+ + +

This lesson teaches you to

+
    +
  1. Update Your Manifest
  2. +
  3. Handle the Incoming Content
  4. +
+ + +

You should also read

+ + +
+
+ +

Just as your application can send data to other applications, so too can it easily receive data +from applications. Think about how users interact with your application, and what data types you +want to receive from other applications. For example, a social networking application would likely +be interested in receiving text content, like an interesting web URL, from another app. The +Google+ Android +application +accepts both text and single or multiple images. With this app, a user can easily start a +new Google+ post with photos from the Android Gallery app.

+ + +

Update Your Manifest

+ +

Intent filters inform the system what intents an application component is willing to accept. +Just as you constructed an intent with action {@link android.content.Intent#ACTION_SEND} in the +Send Content to Other Apps Using Intents +lesson, you create intent filters in order to be able to receive intents with this action. You +define an intent filter in your manifest, using the +<intent-filter> +element. For example, if your application handles receiving text content, a single image of any +type, or multiple images of any type, your manifest would look like:

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

Note: For more information on intent filters and intent resolution +please read Intents and Intent +Filters

+ +

When another application tries to share any of these things by constructing an intent and passing +it to {@link android.content.Context#startActivity(android.content.Intent) startActivity()}, your +application will be listed as an option in the intent chooser (see figure 1). If the user selects +your application, the corresponding activity (.ui.MyActivity in the example above) will +be started. It is then up to you to handle the content appropriately within your code and UI.

+ + +

Handle the Incoming Content

+ +

To handle the content delivered by an {@link android.content.Intent}, start by calling {@link +android.content.Intent#getIntent(String) getIntent()} +to get {@link android.content.Intent} object. Once you have the object, you can examine its +contents to determine what to do next. Keep in mind that if this activity can be started from other +parts of the system, such as the launcher, then you will need to take this into consideration when +examining the intent.

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

Caution: Take extra care to check the incoming data, you never +know what some other application may send you. For example, the wrong MIME type might be set, or the +image being sent might be extremely large. Also, remember to process binary data in a separate +thread rather than the main ("UI") thread.

+ +

Updating the UI can be as simple as populating an {@link android.widget.EditText}, or it can +be more complicated like applying an interesting photo filter to an image. It's really specific +to your application what happens next.

+ diff --git a/docs/html/training/sharing/send.jd b/docs/html/training/sharing/send.jd new file mode 100644 index 0000000000000..d151ed03c7dbe --- /dev/null +++ b/docs/html/training/sharing/send.jd @@ -0,0 +1,194 @@ +page.title=Sending Content to Other Apps +parent.title=Sharing Content +parent.link=index.html + +trainingnavtop=true +next.title=Receiving Content from Other Apps +next.link=receive.html + +@jd:body + +
+
+ + +

This lesson teaches you to

+
    +
  1. Send Text Content
  2. +
  3. Send Binary Content
  4. +
  5. Send Multiple Pieces of Content
  6. +
+ + +

You should also read

+ + +
+
+ +

When you construct an intent, you must specify the action you want the intent to "trigger." +Android defines several actions, including {@link android.content.Intent#ACTION_SEND} which, as +you can probably guess, indicates that the intent is sending data from one activity to another, +even across process boundaries. To send data to another activity, all you need to do is speicify +the data and its type, the system will identify compatible receiving activities and display them +to the user (if there are multiple options) or immediately start the activity (if there is only +one option). Similarly, you can advertise the data types that your activities support receiving +from other applications by specifying them in your manifest.

+ +

Sending and receiving data between applications with intents is most commonly used for social +sharing of content. Intents allow users to share information quickly and easily, using their +favorite social applications.

+ +

Note: The best way to add a share action item to an +{@link android.app.ActionBar} is to use {@link android.widget.ShareActionProvider}, which became +available in API level 14. {@link android.widget.ShareActionProvider} is discussed in the lesson +about Adding an Easy Share Action.

+ + +

Send Text Content

+ +
+ +

+ Figure 1. Screenshot of {@link android.content.Intent#ACTION_SEND} intent chooser +on a handset. +

+
+ +

The most straightforward and common use of the {@link android.content.Intent#ACTION_SEND} +action is sending text content from one activity to another. For example, the built-in Browser +app can share the URL of the currently-displayed page as text with any application. This is useful +for sharing an article or website with friends via email or social networking. Here is the code to +implement this type of sharing:

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

If there's an installed application with a filter that matches +{@link android.content.Intent#ACTION_SEND} and MIME type text/plain, the Android system will run +it; if more than one application matches, the system displays a disambiguation dialog (a "chooser") +that allows the user to choose an app. If you call +{@link android.content.Intent#createChooser(android.content.Intent, CharSequence) +Intent.createChooser()} +for the intent, Android will always display the chooser. This has some +advantages:

+ +
    +
  • Even if the user has previously selected a default action for this intent, the chooser will +still be displayed.
  • +
  • If no applications match, Android displays a system message.
  • +
  • You can specify a title for the chooser dialog.
  • +
+ +

Here's the updated code:

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

The resulting dialog is shown in figure 1.

+ +

Optionally, you can set some standard extras for the intent: +{@link android.content.Intent#EXTRA_EMAIL}, {@link android.content.Intent#EXTRA_CC}, +{@link android.content.Intent#EXTRA_BCC}, {@link android.content.Intent#EXTRA_SUBJECT}. However, +if the receiving application is not designed to use them, nothing will happen. You can use +custom extras as well, but there's no effect unless the receiving application understands them. +Typically, you'd use custom extras defined by the receiving application itself.

+ +

Note: Some e-mail applications, such as Gmail, expect a +{@link java.lang.String String[]} for extras like {@link android.content.Intent#EXTRA_EMAIL} and +{@link android.content.Intent#EXTRA_CC}, use +{@link android.content.Intent#putExtra(String,String[]) putExtra(String, String[])} to add these +to your intent.

+ + +

Send Binary Content

+ +

Binary data is shared using the {@link android.content.Intent#ACTION_SEND} action combined with +setting the appropriate MIME type and placing the URI to the data in an extra named {@link +android.content.Intent#EXTRA_STREAM}. This is commonly used to share an image but can be used to +share any type of 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)));
+
+ +

Note the following:

+
    +
  • You can use a MIME type of {@code "*/*"}, but this will only match activities that are able to +handle generic data streams.
  • +
  • The receiving application needs permission to access the data the {@link android.net.Uri} +points to. There are a number of ways to handle this: +
      +
    • Write the data to a file on external/shared storage (such as the SD card), which all apps +can read. Use {@link android.net.Uri#fromFile(java.io.File) Uri.fromFile()} to create the +{@link android.net.Uri} that can be passed to the share intent. However, keep in mind that not +all applications process a {@code file://} style {@link android.net.Uri}.
    • +
    • Write the data to a file in your own application directory using {@link +android.content.Context#openFileOutput(java.lang.String, int) openFileOutput()} with mode {@link +android.content.Context#MODE_WORLD_READABLE} after which {@link +android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()} can be used to +return a {@link java.io.File}. As with the previous option, {@link +android.net.Uri#fromFile(java.io.File) Uri.fromFile()} will create a {@code file://} style {@link +android.net.Uri} for your share intent.
    • +
    • Media files like images, videos and audio can be scanned and added to the system {@link +android.provider.MediaStore} using {@link +android.media.MediaScannerConnection#scanFile(android.content.Context, java.lang.String[], +java.lang.String[], android.media.MediaScannerConnection.OnScanCompletedListener) scanFile()}. The +{@link +android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, +android.net.Uri) onScanCompleted()} callback returns a {@code content://} style {@link +android.net.Uri} suitable for including in your share intent.
    • +
    • Images can be inserted into the system {@link android.provider.MediaStore} using {@link +android.provider.MediaStore.Images.Media#insertImage(android.content.ContentResolver, +android.graphics.Bitmap, java.lang.String, java.lang.String) insertImage()} which will return a +{@code content://} style {@link android.net.Uri} suitable for including in a share intent.
    • +
    • Store the data in your own {@link android.content.ContentProvider}, make sure that other +apps have the correct permission to access your provider (or use per-URI permissions).
    • +
    +
  • +
+ + +

Send Multiple Pieces of Content

+ +

To share multiple pieces of content, use the {@link android.content.Intent#ACTION_SEND_MULTIPLE} +action together with a list of URIs pointing to the content. The MIME type varies according to the +mix of content you're sharing. For example, if you share 3 JPEG images, the type is still {@code +"image/jpeg"}. For a mixture of image types, it should be {@code "image/*"} to match an activity +that handles any type of image. You should only use {@code "*/*"} if you're sharing out a wide +variety of types. As previously stated, it's up to the receiving application to parse and process +your data. Here's an example:

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

As before, make sure the provided {@link android.net.Uri URIs} point to data that a receiving +application can access.

+ diff --git a/docs/html/training/sharing/shareaction.jd b/docs/html/training/sharing/shareaction.jd new file mode 100644 index 0000000000000..f6be745b93b84 --- /dev/null +++ b/docs/html/training/sharing/shareaction.jd @@ -0,0 +1,115 @@ +page.title=Adding an Easy Share Action +parent.title=Sharing Content +parent.link=index.html + +trainingnavtop=true +previous.title=Receiving Content from Other Apps +previous.link=receive.html + +@jd:body + +
+
+ + +

This lesson teaches you to

+
    +
  1. Update Menu Declarations
  2. +
  3. Set the Share Intent
  4. +
+ + +

You should also read

+ + +
+
+ + +

Implementing an effective and user friendly share action in your {@link android.app.ActionBar} +is made even easier with the introduction of {@link android.view.ActionProvider} in Android 4.0 +(API Level 14). An {@link android.view.ActionProvider}, once attached to a menu item in the action +bar, handles both the appearance and behavior of that item. In the case of {@link +android.widget.ShareActionProvider}, you provide a share intent and it does the rest.

+ +

Note:  {@link android.widget.ShareActionProvider} is available +starting with API Level 14 and higher.

+ + +
+ +

+ Figure 1. The {@link android.widget.ShareActionProvider} in the Gallery app. +

+
+ +

Update Menu Declarations

+ +

To get started with {@link android.widget.ShareActionProvider ShareActionProviders}, define the android:actionProviderClass attribute for the corresponding <item> in your menu resource file:

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

This delegates responsibility for the item's appearance and function to +{@link android.widget.ShareActionProvider}. However, you will need to tell the provider what you +would like to share.

+ + +

Set the Share Intent

+ +

In order for {@link android.widget.ShareActionProvider} to function, you must provide it a share +intent. This share intent should be the same as described in the Sending Content to Other Apps +lesson, with action {@link android.content.Intent#ACTION_SEND} and additional data set via extras +like {@link android.content.Intent#EXTRA_TEXT} and {@link android.content.Intent#EXTRA_STREAM}. To +assign a share intent, first find the corresponding {@link android.view.MenuItem} while inflating +your menu resource in your {@link android.app.Activity} or {@link android.app.Fragment}. Next, call +{@link android.view.MenuItem#getActionProvider() MenuItem.getActionProvider()} to retreive an +instance of {@link android.widget.ShareActionProvider}. Use {@link +android.widget.ShareActionProvider#setShareIntent(android.content.Intent) setShareIntent()} to +update the share intent associated with that action item. Here's an example:

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

You may only need to set the share intent once during the creation of your menus, or you may +want to set it and then update it as the UI changes. For example, when you view photos full screen +in the Gallery app, the sharing intent changes as you flip between photos.

+ +

For further discussion about the {@link android.widget.ShareActionProvider}, see the Action Bar guide.

+ +