2012-02-05 12 views
4

How can I send emails from my Android application?選択子で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 

を使用しています。しかし、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がでアプリケーションをクラッシュするユーザーによって選ばれた場合、現在のアプリケーションはバグだつもり

を送信するための十分な権限を持っていないとして、いくつかのアプリケーションは、あります他のアプリではアプリはという一般的なアクションをサポートする必要がありません。ACTION_SENDのようなアクションは、カスタムアクセス権が必要です。これを書いてhttp://b.android.comに投稿することをお勧めします。このエラーを再現するために提供できるその他の情報は、私はあなたがどんなアプリに遭遇したか分からないが(パッケージはおそらくGmailを示唆している)、明らかにGoogle製のアプリだ。問題の許可があることは言うまでもありません、私はマニフェストに不足している権限を追加する必要はありません

(私は他のアプリケーションがチューに表示されるかわからない)

SDKではありません。

ただし、SecurityExceptionを処理してユーザーに通知するだけです。私はどこでそうするだろうか?

重要な質問は次のとおりです。この例外は実際にはのプロセスで発生していますか?

答えが「はい」の場合は、ThreadsetDefaultUncaughtExceptionHandler()が問題の原因となります。既にクラッシュレポーター(ACRAなど)に参加させている可能性があります。

答えが「いいえ」の場合、あなたは不運です。

+0

実際には "Google Mail"で、 "Gmail"は問題なく動作します。私はバグ報告を書くつもりで、私は未キャッチ例外ハンドラを試してみます。これは私の環境設定ページとプロセスを強制終了させるので、私のプロセスで起こっていると思います。それを試してみましょう:)あなたのご意見ありがとうございました! –

+0

キャッチされていない例外ハンドラ(デフォルト)またはメインスレッドを設定すると、セレクタが完全にロックアップされます。私のハンドラが呼び出されていますが、私が何をしているにせよ、セレクタはフォアグラウンドにぶら下がっています。私はハンドラを削除し、私のアプリがクラッシュするようにします。これは実際にハンターの選択者よりも優れています。 –

+0

@MartinC .: 'PackageManager'と' queryIntentActivities() 'を使って、あなたのチューザーを動かす。 – CommonsWare

関連する問題