diff options
5 files changed, 118 insertions, 6 deletions
diff --git a/samples/ApiDemos/AndroidManifest.xml b/samples/ApiDemos/AndroidManifest.xml index 4cd7666c4..eb3df12ef 100644 --- a/samples/ApiDemos/AndroidManifest.xml +++ b/samples/ApiDemos/AndroidManifest.xml @@ -1235,6 +1235,13 @@ </intent-filter> </activity> + <activity android:name=".content.ShareContent" android:label="@string/activity_share_content"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.SAMPLE_CODE" /> + </intent-filter> + </activity> + <activity android:name=".content.ChangedContacts" android:label="@string/activity_changed_contact"> <intent-filter> <action android:name="android.intent.action.MAIN"/> @@ -1261,6 +1268,8 @@ <provider android:name=".content.FileProvider" android:authorities="com.example.android.apis.content.FileProvider" + android:grantUriPermissions="true" + android:exported="false" android:enabled="@bool/atLeastHoneycombMR2" /> <!-- ************************************* --> diff --git a/samples/ApiDemos/res/layout/share_content.xml b/samples/ApiDemos/res/layout/share_content.xml new file mode 100644 index 000000000..e9d547968 --- /dev/null +++ b/samples/ApiDemos/res/layout/share_content.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- Demonstrates selecting various types of contact data. --> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="4dip" + android:gravity="center_horizontal" + android:layout_width="match_parent" android:layout_height="match_parent"> + + <TextView + android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_weight="0" + android:textAppearance="?android:attr/textAppearanceMedium" + android:paddingBottom="8dip" + android:text="@string/share_content_msg"/> + + <Button android:id="@+id/share_image" + android:layout_width="wrap_content" android:layout_height="wrap_content" + android:text="@string/share_image"> + <requestFocus /> + </Button> +</LinearLayout> diff --git a/samples/ApiDemos/res/values/strings.xml b/samples/ApiDemos/res/values/strings.xml index 8b42970b6..0b1c62e9d 100644 --- a/samples/ApiDemos/res/values/strings.xml +++ b/samples/ApiDemos/res/values/strings.xml @@ -459,6 +459,11 @@ <string name="pick_phone">Pick a Phone</string> <string name="pick_address">Pick an Address</string> + <string name="activity_share_content">Content/Provider/Share Content</string> + <string name="share_content_msg">Share private data of the app by granting access + to a specific URI in its content provider.</string> + <string name="share_image">Share Image</string> + <string name="activity_changed_contact">Content/Provider/Changed Contacts</string> <string name="activity_install_apk">Content/Packages/Install Apk</string> diff --git a/samples/ApiDemos/src/com/example/android/apis/content/FileProvider.java b/samples/ApiDemos/src/com/example/android/apis/content/FileProvider.java index f26bcdaf4..63d891d09 100644 --- a/samples/ApiDemos/src/com/example/android/apis/content/FileProvider.java +++ b/samples/ApiDemos/src/com/example/android/apis/content/FileProvider.java @@ -111,14 +111,19 @@ public class FileProvider extends ContentProvider } @Override - public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { + public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { // Try to open an asset with the given name. try { - InputStream is = getContext().getAssets().open(uri.getPath()); - // Start a new thread that pipes the stream data back to the caller. - return new AssetFileDescriptor( - openPipeHelper(uri, null, null, is, this), 0, - AssetFileDescriptor.UNKNOWN_LENGTH); + String path = uri.getPath(); + int off = path.indexOf('/', 1); + if (off < 0 || off >= (path.length()-1)) { + throw new FileNotFoundException("Unable to open " + uri); + } + int cookie = Integer.parseInt(path.substring(1, off)); + String assetPath = path.substring(off+1); + AssetFileDescriptor asset = getContext().getAssets().openNonAssetFd(cookie, assetPath); + return new ParcelFileDescriptor(openPipeHelper(uri, null, null, + asset.createInputStream(), this)); } catch (IOException e) { FileNotFoundException fnf = new FileNotFoundException("Unable to open " + uri); throw fnf; diff --git a/samples/ApiDemos/src/com/example/android/apis/content/ShareContent.java b/samples/ApiDemos/src/com/example/android/apis/content/ShareContent.java new file mode 100644 index 000000000..247c7fc69 --- /dev/null +++ b/samples/ApiDemos/src/com/example/android/apis/content/ShareContent.java @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2015, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.apis.content; + +import android.app.Activity; +import android.content.ClipData; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.util.TypedValue; +import android.view.View; +import android.widget.Button; +import com.example.android.apis.R; + +/** + * Example of sharing content from a private content provider. + */ +public class ShareContent extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.share_content); + + // Watch for button clicks. + ((Button)findViewById(R.id.share_image)).setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + Uri.Builder b = new Uri.Builder(); + b.scheme("content"); + b.authority("com.example.android.apis.content.FileProvider"); + TypedValue tv = new TypedValue(); + getResources().getValue(R.drawable.jellies, tv, true); + b.appendEncodedPath(Integer.toString(tv.assetCookie)); + b.appendEncodedPath(tv.string.toString()); + Uri uri = b.build(); + intent.setType("image/jpeg"); + intent.putExtra(Intent.EXTRA_STREAM, uri); + intent.setClipData(ClipData.newUri(getContentResolver(), "image", uri)); + startActivity(Intent.createChooser(intent, "Select share target")); + } + }); + } +} |