2017-05-23 3 views
0

アンドロイドの共有メニューに画像を保存して「画像を保存」する必要があります.9gagアプリでこのようなものを見ました。共有メニューに「保存」してメニューを一番下に表示します。しかし、どのように達成することができますか?私がやった何 enter image description hereアンドロイドの共有メニューをカスタマイズするにはどうすればいいですか?

: 私は、サービスおよび本サービスのダウンロードイメージ

<activity 
      android:name=".model.services.ShareActivity" 
      android:icon="@drawable/download_icon" 
      android:label="Save"> 
      <intent-filter 
       android:label="Save" 
       android:icon="@drawable/download_icon"> 
       <action android:name="android.intent.action.SEND" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <data android:mimeType="image/*"/> 
      </intent-filter> 
     </activity> 

、今、私は共有メニューでこのアイコンを持っており、それが動作を起動するマニフェストのインテントフィルタを持つ空のアクティビティを追加しましたこのアイコンはほかのアプリの共有メニューにも表示されます。アプリでのみ表示する必要があります。どうすればプライベートなのか何かを作ることができますか?

+0

アイコンはほかのアプリにも表示されますか?あなたは他の活動を意味したくありませんでしたか? –

+0

Yeap、それは他のアプリケーションにも表示されます。アンドロイドギャラリでも共有イメージメニューに自分のアプリの「保存」アイテムがあります。他のアプリケーション共有メニューから自分の「保存」アクティビティを除外したい –

答えて

0

私は解決策を見つけました。まず、イメージの保存目的を扱うアクティビティが必要です。このアクティビティはサービスなどを起動できます。

<activity 
     android:name=".model.services.ShareActivity" 
     android:icon="@drawable/download_icon" 
     android:label="Save"> 
     <intent-filter 
      android:label="Save" 
      android:icon="@drawable/download_icon"> 
      <action android:name="com.my_app.random_text.SAVE_IMAGE" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:mimeType="image/*"/> 
     </intent-filter> 
    </activity> 

ここではインテントフィルタは、カスタムアクションがあります。SaveImageService我々はマニフェストにいくつかのテキストを追加する必要があり、SDカードに 第二の保存画像を扱う静的メソッドを持ってい

public class ShareActivity extends Activity { 
    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bundle extras = getIntent().getExtras(); 
     String url = extras.getString("url"); 
     String name = extras.getString("name"); 
     String description = extras.getString("description"); 
     SaveImageService.downloadFile(url, name, description); 
     finish(); 
    } 
} 

:私はこのようにそれを作ります(これは重要です)このカスタムアクションは、アプリケーションパッケージや何かではなく、ちょうどいくつかの文字列です(私はそれが好きなのでパッケージ名を使用しています)。 次に、我々はメニューリストを共有するためにこの活動を追加する必要があります。

これはImageViewの

から他のアプリに
// Returns the URI path to the Bitmap displayed in specified ImageView 
    static public Uri getLocalBitmapUri(ImageView imageView) { 
     // Extract Bitmap from ImageView drawable 
     Drawable drawable = imageView.getDrawable(); 
     Bitmap bmp = null; 
     if (drawable instanceof BitmapDrawable) { 
      bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); 
     } else { 
      return null; 
     } 
     // Store image to default external storage directory 
     Uri bmpUri = null; 
     try { 
      File file = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DOWNLOADS), "share_image_" + System.currentTimeMillis() + ".png"); 
      file.getParentFile().mkdirs(); 
      FileOutputStream out = new FileOutputStream(file); 
      bmp.compress(Bitmap.CompressFormat.JPEG, 80, out); 
      out.close(); 
      bmpUri = Uri.fromFile(file); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return bmpUri; 
    } 

を共有するためのビットマップURIを取得し、これは画像プラス私たちの保存を共有することができ、すべてのアプリを収集しますイメージの目的

public void shareExcludingApp(Context ctx, PhotoView snapImage) { 
     // Get access to the URI for the bitmap 
     Uri bmpUri = ShareTool.getLocalBitmapUri(snapImage); 
     if (bmpUri == null) return; 

     List<Intent> targetedShareIntents = new ArrayList<>(); 
     //get all apps which can handle such intent 
     List<ResolveInfo> resInfo = ctx.getPackageManager().queryIntentActivities(createShareIntent(bmpUri), 0); 
     if (!resInfo.isEmpty()) { 
      for (ResolveInfo info : resInfo) { 
       Intent targetedShare = createShareIntent(bmpUri); 
       //add all apps excluding android system and ourselves 
       if (!info.activityInfo.packageName.equals(getContext().getPackageName()) 
         && !info.activityInfo.packageName.contains("com.android")) { 
        targetedShare.setPackage(info.activityInfo.packageName); 
        targetedShare.setClassName(
          info.activityInfo.packageName, 
          info.activityInfo.name); 
        targetedShareIntents.add(targetedShare); 
       } 
      } 
     } 
     //our local save feature will appear in share menu, intent action SAVE_IMAGE in manifest 
     Intent targetedShare = new Intent("com.my_app.random_text.SAVE_IMAGE"); //this is that string from manifest! 
     targetedShare.putExtra(Intent.EXTRA_STREAM, bmpUri); 
     targetedShare.setType("image/*"); 
     targetedShare.setPackage(getContext().getPackageName()); 
     targetedShare.putExtra("url", iSnapViewPresenter.getSnapUrlForSave()); 
     targetedShare.putExtra("name", iSnapViewPresenter.getSnapNameForSave()); 
     targetedShare.putExtra("description", iSnapViewPresenter.getSnapDescriptionForSave()); 
     targetedShareIntents.add(targetedShare); 

     //collect all this intents in one list 
     Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), 
       "Share Image"); 

     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, 
       targetedShareIntents.toArray(new Parcelable[targetedShareIntents.size()])); 

     ctx.startActivity(chooserIntent); 
    } 
関連する問題