2015-05-25 53 views
0

我已經在我的android應用程序中實現了自定義共享對話框。我共享圖像,足夠有趣,它不適用於Evernote應用程序。我可以使用默認方式與Evernote共享。但它並不適用於這個代碼。我僅在Evernote應用程序中遇到過這種情況。自定義共享對話框,不適用於某些應用程序

這是我的代碼:

public void doShareCustomDialog() { 
    Bitmap curBitmap = ((ImagePagerAdapter) viewPager.getAdapter()) 
      .getCurrentBitmap(); 
    final Intent imageIntent = new Intent(); 
    imageIntent.setAction(Intent.ACTION_SEND); 
    imageIntent.setType("image/jpeg"); 
    imageIntent.putExtra(Intent.EXTRA_STREAM, 
      getImageUri(getActivity(), curBitmap)); 

    final Dialog dialog = new Dialog(getActivity()); 
    dialog.setTitle("Choose application:"); 
    dialog.getWindow().setBackgroundDrawable(
      new ColorDrawable(R.color.black_overlay)); 
    dialog.setCanceledOnTouchOutside(true); 
    ListView lv = new ListView(getActivity()); 
    dialog.setContentView(lv); 
    dialog.show(); 

    PackageManager pm = getActivity().getPackageManager(); 
    List<ResolveInfo> launchables = pm 
      .queryIntentActivities(imageIntent, 0); 
    Collections 
      .sort(launchables, new ResolveInfo.DisplayNameComparator(pm)); 

    final AppAdapter adapter = new AppAdapter(pm, launchables); 
    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      ResolveInfo launchable = adapter.getItem(position); 
      ActivityInfo activity = launchable.activityInfo; 
      ComponentName name = new ComponentName(
        activity.applicationInfo.packageName, activity.name); 
      imageIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
      imageIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
      imageIntent.setComponent(name); 
      startActivity(imageIntent); 
     } 
    }); 

} 

這是getUri()方法:

public Uri getImageUri(Context inContext, Bitmap inImage) { 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = Images.Media.insertImage(inContext.getContentResolver(), 
      inImage, "Title", null); 
    latestSharedImageURI = Uri.parse(path); 
    return latestSharedImageURI; 
} 

這裏此代碼工作完全正常,但其沒有自定義對話框,但默認的。

public void doShare() { 
    Bitmap curBitmap = ((ImagePagerAdapter) viewPager.getAdapter()) 
      .getCurrentBitmap(); 
    Intent intent = new Intent(); 
    intent.setAction(Intent.ACTION_SEND); 
    intent.setType("image/jpeg"); 
    intent.putExtra(Intent.EXTRA_STREAM, 
      getImageUri(getActivity(), curBitmap)); 
    setShareIntent(intent); 
    startActivity(Intent.createChooser(intent, 
      getResources().getText(R.string.share_choose))); 
} 
+0

這不是你的應用程序的問題。這是'Evernote'應用程序的問題。 –

+0

請解釋「不起作用」的含義。 – CommonsWare

+0

當我點擊共享菜單列表中的Evernote按鈕時,什麼都不會發生。並且很可能是它的Evernote問題,但是爲什麼會發生這種情況,我該如何才能使其工作。是否在意圖中存在一些問題? – risto

回答

0

我首先需要提到的是,我是Evernote員工。我試過你的片段,它可以工作。這取決於這種方法:

imageIntent.putExtra(Intent.EXTRA_STREAM, 
     getImageUri(getActivity(), curBitmap)); 

您可能想要發佈如何生成Uri。在我的測試中,如果你的文件在你的應用程序的內部存儲器中,這肯定不起作用。如果文件存儲在外部存儲器上,那麼如果Uri是正確的,那麼你的代碼就可以工作。

如果要共享內部存儲器中的文件,您需要實施FileProvider並生成帶有getUriForFile的Uri。然後它與我的測試一起工作。

+0

我更新了我的答案,檢查它。 – risto

+0

與工作意圖的區別是** imageIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); ** 您確定要重置並創建新任務嗎?如果用戶點擊後退按鈕,這可能會導致意想不到的結果。你不會回到你的應用程序,但留在收到共享意圖的其他應用程序。另外,如果新應用程序已經有後退堆棧,則新的活動不會開始,例如,打開消息應用程序,打開設置,按回家,進入你的應用程序,與消息應用程序共享你的位圖。沒有新消息正在創建。 – vRallev

+0

刪除該行,修復它,我仍然沒有得到,爲什麼發生這種情況。但非常感謝! – risto

相關問題