2012-02-05 66 views
4

我使用如何處理從selectActivity中從startActivity拋出的SecurityException?

final Intent notice = new Intent(); 
notice.setType("text/plain"); 
notice.putExtra(Intent.EXTRA_SUBJECT, "My Subject"); 
notice.putExtra(Intent.EXTRA_TEXT, "My Text"); 

try { 
    getContext().startActivity(Intent.createChooser(notice, "Send...")); 
} catch(final android.content.ActivityNotFoundException ex) { 
    Toast.makeText(getContext(), "There are no email clients installed.", Toast.LENGTH_SHORT).show(); 
} catch(final SecurityException ex) { 
    Toast.makeText(getContext(), "Sorry, application does not have permissions to send to this destination.", Toast.LENGTH_SHORT).show(); 
} // try/catch 

How can I send emails from my Android application?

表明但是,也有一些應用程序,如果用戶選擇,這將有SecurityException應用程序崩潰,因爲目前的應用程序沒有足夠的權限發送的目的:

 
02-05 23:11:33.417: E/AndroidRuntime(20255): java.lang.SecurityException: Permission Denial: starting Intent { typ=text/plain flg=0x3000000 cmp=com.google.android.gm/.AutoSendActivity (has extras) } from ProcessRecord{4084ca60 20255:com.example.myapp/10065} (pid=20255, uid=10065) requires com.google.android.gm.permission.AUTO_SEND 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.os.Parcel.readException(Parcel.java:1322) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.os.Parcel.readException(Parcel.java:1276) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1351) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1374) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.app.Activity.startActivityForResult(Activity.java:2827) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.app.Activity.startActivity(Activity.java:2933) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at com.android.internal.app.ResolverActivity.onIntentSelected(ResolverActivity.java:203) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at com.android.internal.app.ResolverActivity.onClick(ResolverActivity.java:117) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:873) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.widget.ListView.performItemClick(ListView.java:3513) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.os.Handler.handleCallback(Handler.java:587) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.os.Looper.loop(Looper.java:130) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at android.app.ActivityThread.main(ActivityThread.java:3683) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at java.lang.reflect.Method.invokeNative(Native Method) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at java.lang.reflect.Method.invoke(Method.java:507) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-05 23:11:33.417: E/AndroidRuntime(20255): at dalvik.system.NativeStart.main(Native Method) 

正如你所看到的,異常沒有直接觸及我的任何代碼。我不想將缺少的權限添加到清單中(我不知道哪些其他應用程序會顯示在選擇器中),但只需處理SecurityException並通知用戶。我會在哪裏做?

我在Android 2.3.6在這種情況下。

在此先感謝!

回答

4

但是,也有一些應用中,如果選擇了用戶,這將導致應用程序崩潰與一個SecurityException,作爲當前應用程序沒有足夠的權限來發送打算

這是一個錯誤在另一個應用程序。沒有應用程序應支持通用Intent動作,如ACTION_SEND需要自定義權限。我真的建議你寫下這些信息並將其發佈到http://b.android.com,並提供任何其他信息來重現此錯誤。我不確定你遇到了什麼應用程序(該程序包暗示可能是Gmail),但它顯然是Google生產的應用程序。

我不想丟失的許可添加到清單(我不知道其它哪些應用程序將在選配顯示)

且不說有問題的權限不在SDK中。

但只是處理SecurityException並通知用戶。我會在哪裏做?

關鍵問題是:這個異常實際發生在你的進程中嗎?

如果答案是肯定的,那麼ThreadsetDefaultUncaughtExceptionHandler()將是你找到問題的地方。您可能已經在使用這個功能來綁定崩潰記者(例如ACRA)。

如果答案是否定的,那麼你運氣不好。

+0

它實際上是「谷歌郵件」,「Gmail」工作正常(不管區別是什麼)。我將編寫錯誤報告,並嘗試未捕獲的異常處理程序。它強制關閉我的偏好頁面和我的過程,所以我認爲它正在我的過程中發生。讓我們試試:)非常感謝您的意見! – 2012-02-05 23:00:00

+0

設置未捕獲的異常處理程序(默認情況下)或主線程只會導致選擇器完全鎖定。我的處理程序正在被調用,但無論我做什麼,選配器都保持在前臺。我將刪除處理程序,讓我的應用程序崩潰,這實際上比懸掛選擇器更好。 – 2012-02-05 23:23:05

+0

@MartinC .:使用'PackageManager'和'queryIntentActivities()'推動推動,推出自己的選擇器。 – CommonsWare 2012-02-06 00:52:09

相關問題