2012-11-28 23 views
10

Tôi đang cố gắng cho phép người dùng của mình chọn một liên hệ trong số các địa chỉ liên hệ có địa chỉ email. Đây là mã được thực hiện khi họ nhấp vào nút thích hợp:Ngoại lệ xảy ra đối với một số người dùng có bộ chọn liên hệ email

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); 
startActivityForResult(intent, PICK_CONTACT); 

này đang làm việc tốt trên điện thoại của riêng tôi, nhưng sau khi phát hành ứng dụng của tôi tôi nhìn thấy ngoại lệ sau đây xảy ra đối với một số người dùng của tôi:

0  android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.PICK dat=content://com.android.contacts/data/emails } 
1 at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1638) 
2 at android.app.Instrumentation.execStartActivity(Instrumentation.java:1510) 
3 at android.app.Activity.startActivityForResult(Activity.java:3244) 
4 at com.fitrocket.android.InviteMethodSelectionAct.onClick(InviteMethodSelectionAct.java:59) 
5 at android.view.View.performClick(View.java:3549) 
6 at android.view.View$PerformClick.run(View.java:14400) 
7 at android.os.Handler.handleCallback(Handler.java:605) 
8 at android.os.Handler.dispatchMessage(Handler.java:92) 
9 at android.os.Looper.loop(Looper.java:154) 
10 at android.app.ActivityThread.main(ActivityThread.java:4945) 
11 at java.lang.reflect.Method.invokeNative(Native Method) 
12 at java.lang.reflect.Method.invoke(Method.java:511) 
13 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
14 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
15 at dalvik.system.NativeStart.main(Native Method) 

Tôi chưa thể tự mình tái tạo nên tôi tự hỏi liệu có ai có thể cho tôi biết vấn đề có thể là gì không?

+0

Không phải là giải pháp nhưng nếu bạn không thể tìm thấy nó, bạn có thể muốn phát hành phiên bản in Build.MODEL và chuỗi email (nếu có thể) cũng như các thông số khác gây ra lỗi cho nhật ký và gửi cho bạn, để bạn có thể gage tốt hơn/tái tạo vấn đề. Đôi khi, nếu một người dùng cụ thể gửi email cho bạn, bạn có thể gửi cho họ một bản dựng đặc biệt với khả năng ghi nhật ký như thế này để tìm sự cố nhanh hơn. – KDEx

+0

Đó là một ý tưởng hay, cảm ơn. – Catherine

+0

Điều này có bao giờ được khắc phục không? – sinek

Trả lời

3

Không chính xác giải pháp bạn đang tìm kiếm nhưng điều tương tự cũng xảy ra với tôi khi sử dụng mục đích ACTION_PICK để chọn một ứng dụng. Thông thường, điều sẽ xảy ra là hoạt động sẽ mất một thời gian dài để khởi chạy vì lý do không rõ ràng và đôi khi chỉ gặp sự cố với ngoại lệ "Không tìm thấy hoạt động". Những gì tôi đã làm là xây dựng hoạt động của riêng tôi liệt kê các ứng dụng có sẵn. Trong trường hợp của bạn, bạn có thể làm tương tự cho các liên hệ bằng cách sử dụng con trỏ để truy vấn tất cả các liên hệ bằng email và hiển thị hộp thoại/hoạt động để cho phép người dùng lựa chọn. Nghe như một cách giải quyết khủng khiếp nhưng có thể là nhanh nhất để thực hiện ... (Xem mã mẫu here)

Một cách khác là liên hệ với những người dùng đó và xem họ có ứng dụng danh bạ tùy chỉnh không hỗ trợ loại nội dung ContactsContract.CommonDataKinds.Email.CONTENT_URI.

+0

+1 mặc dù xây dựng hoạt động của riêng tôi không phải là một lựa chọn tại thời điểm này. – sinek

3

Vấn đề xa như tôi có thể thấy là bạn giả định rằng mỗi người dùng có một ứng dụng được cài đặt có thể đáp ứng với kết hợp dữ liệu hành động mà bạn muốn thực hiện. Mặc dù giả định có thể giữ đúng trong trường hợp của bạn, một số người dùng có thể đã chọn gây rối với hệ thống của họ và có thể đã cài đặt ứng dụng để quản lý các liên hệ của họ không thể phản hồi lại hành động bạn khởi chạy. Bất kể lý do gì, bạn luôn phải kiểm tra tính khả dụng của ứng dụng để trả lời cho số Intent của mình.

public static boolean isIntentAvailable(Context context, String action) 
{ 
    final PackageManager packageManager = context.getPackageManager(); 
    final Intent intent = new Intent(action); 
    List<ResolveInfo> list = 
      packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 

Mã này sẽ trở true nếu ít nhất một ứng dụng có sẵn mà bạn đã tuyên bố như tham số action. Xem Intents and Intent Filters để biết tài liệu chính thức về vấn đề tôi đã mô tả ở trên.

Bây giờ, điều này là tất cả tốt và tốt nhưng nó sẽ giải quyết những gì? Trước tiên, ứng dụng của người dùng của bạn sẽ không bị lỗi. Sau đó, bạn cần phải phục hồi từ thực tế là bạn không thể tiến hành như bạn đã nghĩ rằng bạn có thể. Thông thường, hiển thị một tin nhắn cho người dùng và đề xuất rằng anh ta cài đặt một ứng dụng mà bạn biết cung cấp chức năng hoạt động khá tốt. Ngoài ra, tôi muốn lưu ý sự phụ thuộc này trong tài liệu của bạn để nó rõ ràng cho tất cả người dùng của bạn những gì họ cần.

Cập nhật: Các nguồn khác để bạn có thể xem xét:

Tôi tin rằng sau này giữ lời giải thích chính xác là tại sao tai nạn ứng dụng của bạn.Tôi xin trích dẫn:

"Caution: If you invoke an intent and there is no app available on the device that can handle the intent, your app will crash."

Đó phần cũng giữ thêm thông tin về làm thế nào để đối phó với vấn đề này.

+0

Ah, quên đề cập trước đó ... Đây là cách tôi đã giải quyết nó. Trước tiên, tôi sẽ thử nghiệm nếu mục đích có sẵn - nếu không, tôi chỉ hiển thị bộ chọn liên hệ chung. Cảm ơn mặc dù - sẽ trao nó với tiền thưởng. – sinek

+0

Bạn được chào đón. Vui lòng xem tài nguyên cuối cùng tôi đã liên kết, nó chứa một số mẹo về cách hướng dẫn người dùng tải ứng dụng mà anh ấy cần để chạy ứng dụng của bạn thành công. – Eric

Các vấn đề liên quan