2012-04-30 21 views
5

Các Yêu cầu:Wrapping Ý định trong LabeledIntent cho mục đích hiển thị

Tôi có một nút "chia sẻ" trong ứng dụng của tôi. Tôi có yêu cầu chia sẻ qua Facebook. Tôi cần có tùy chọn có cài đặt ứng dụng Facebook gốc hay không. Quyết định của chúng tôi là gửi người dùng đến facebook.com để chia sẻ nếu ứng dụng chưa được cài đặt.

Nhà nước hiện tại:

tôi có thể phát hiện khi ứng dụng bản địa không được cài đặt (thông qua tên gói), và thêm ý đồ bổ sung cho tính năng chọn.

Vấn đề:

Mục người dùng phải chọn để chia sẻ thông qua "Trang web của Facebook" nói, "Browser" và có biểu tượng Trình duyệt Android. Mục LabeledIntent không xuất hiện và tôi nhận được một "Không tìm thấy cho Ý định hoạt động {hành động = android.intent.action.VIEW dat = ...}

Bộ luật (giản thể ...):

Intent intent = new Intent(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_SUBJECT, "check this out"); 
intent.putExtra(Intent.EXTRA_TEXT, urlToShare); 
boolean facebookInstalled = false; 

Intent chooser = Intent.createChooser(intent, "Share this link!"); 
if (!facebookInstalled) 
{ 
    Intent urlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.facebook.com/sharer/sharer.php?u=" + Uri.encode(urlToShare))); 
    Intent niceUrlIntent = new LabeledIntent(urlIntent, context.getApplicationContext().getPackageName(), "Facebook's Website", R.drawable.icon); 

    // Ideally I would only add niceUrlIntent in the end, but that doesn't add anything to the chooser as-is 
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[urlIntent, niceUrlIntent]); 
} 
context.startActivity(chooser); 

giải pháp

các giải pháp như @CommonsWare chỉ ra, là sử dụng LabeledIntent để quấn một ý định mà đi đến một Hoạt động mới mà tôi tạo ra, mà chỉ đơn giản gửi một ý định ACTION_VIEW đến Uri thích hợp.

Intent myActivity = new Intent(context, ViewUriActivity.class); 
myActivity.putExtra(ViewUriActivity.EXTRA_URI, "http://..."); 
Intent niceUrlIntent = new LabeledIntent(myActivity, context.getApplicationContext().getPackageName(), "Facebook's Website", R.drawable.icon); 
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{niceUrlIntent}); 

Các ViewUriActivity trông như thế này:

public final class ViewUriActivity extends Activity 
{ 
    public static final String EXTRA_URI = ViewUriActivity.class.getSimpleName() + "EXTRA_URI"; 

    protected void onCreate(final Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     Intent urlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(getIntent().getExtras().getString(EXTRA_URI))); 
     startActivity(urlIntent); 
     finish(); 
    } 
} 
+0

Tại sao các bạn thêm hai ban đầu 'Intent's để tính năng chọn của bạn? Có vẻ như bạn đang thêm cả hai nhãn có gắn nhãn và không có nhãn 'Intent'. Điều gì sẽ xảy ra nếu bạn xóa 'urlIntent' khỏi mảng' Intent '? –

+1

Đẩy đến xô, tạo hoạt động của riêng bạn mà bạn đưa vào trình chọn, được đặt bằng 'Theme.NoDisplay' và, trong' onCreate() ', gọi' startActivity() 'để hiển thị trình duyệt trên Facebook, sau đó gọi 'finish()'. Về cơ bản, bạn sử dụng hoạt động của riêng mình làm cầu nối. Lý tưởng nhất, bạn sẽ không cần điều này, nhưng tôi đã không thử những gì bạn đang cố gắng làm, vì vậy tôi không biết những gì có thể xảy ra sai (bên cạnh bình luận của Jon O ở trên). – CommonsWare

+0

@ JonO, tôi đặt cả hai người trong đó, vì vậy bạn có thể thấy hai lần thử của tôi.Việc xóa "urlIntent" khỏi extra_initial_intents khiến tôi không có ý định bổ sung nào trong danh sách và tôi nhận được cảnh báo mà tôi đã đề cập. Việc xóa "niceUrlIntent" khỏi extra_initial_intents khiến tôi có thêm một ý định "Browser", điều không thể chấp nhận được và không có cảnh báo trong LogCat. – xbakesx

Trả lời

7

Mặc dù không có giấy tờ, trông giống như LabeledIntents chỉ làm việc trên Intents giải quyết. Vì vậy, trừ khi ý định đã có một hoạt động cụ thể và gói được xác định, bạn sẽ không thể sử dụng nó.

Điều này không đáng ngạc nhiên vì có thể có nhiều Hoạt động có thể được giải quyết cho một LabeledIntent và chooserActivity của bạn sẽ hiển thị tất cả các biểu tượng và tên giống nhau.

Vì vậy, trong trường hợp của bạn, trước tiên bạn sẽ phải giải quyết tính tuân thủ và sau đó sử dụng LabeledIntent. Nhưng điều này có thể khiến người dùng không thể chọn trình duyệt theo lựa chọn của mình. Sử dụng chức năng dưới đây để lấy LabeledIntent từ ý định của bạn.

Intent urlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.facebook.com/sharer/sharer.php?u=" + Uri.encode(urlToShare))); 
Intent niceUrlIntent = getLabelintent(urlIntent, "Facebook's Website", R.drawable.icon); 

Và getLabelIntent

public LabeledIntent getLabelintent(Intent in, String name, int drawable) { 
    PackageManager pm = getPackageManager(); 
    ComponentName launchname = in.resolveActivity(pm); 
    if (launchname != null) { 
     Intent resolved = new Intent(); 
     resolved.setComponent(launchname); 
     resolved.setData(in.getData()); 
     LabeledIntent niceUrlIntent = new LabeledIntent(resolved, 
       getPackageName(), name, drawable); 

     return niceUrlIntent; 
    } 
    return null; 
} 
Các vấn đề liên quan