2017-03-03 7 views
2

に欠け許可にすべての活動は、ログインで保護されて失敗します。
各アクティビティのチェックがそのonCreate/onShowにユーザーがログインしているかどうかを-callbackその場合は、特別なことは何も起こりません。ユーザがログインしていない場合には、これらのコールバックは、LoginActivityにユーザーをリダイレクトし、現在の活動終了:に追加さ再送意図が原因私のアプリでURI

Intent loginIntent = new Intent(this, LoginActivity.class); 
loginIntent.putExtra(EXTRA_ORIGINAL_INTENT, getIntent()); 
finish(); 
startActivity(loginIntent); 
ショー上記線として

、現在の活動を開始するために使用された元のIntentloginIntentのエキストラ。したがって、LoginActivityは成功したログイン後にIntentを再送信できます...理論的には。しかし、それは必ずしも機能しません。

ランチャーから起動したときにそれは動作します:

Intent with ACTION_MAIN --> MainActivity --> Redirect to LoginActivity --> 
Redirect back to MainActivity after successful login 

クロム上の共有ボタンを使用する場合には動作しません:

Intent with ACTION_SEND --> SendActivity --> Redirect to LoginActivity --> 
Redirect back to SendActivity after successful login 

問題が再送信しようとする最後のリダイレクトです元のIntentは、最初に起動するために使用されました。SendActivity

// Resend original intent 
startActivity((Intent) getIntent().getExtra(EXTRA_ORIGINAL_INTENT)); 

それは例外で失敗します。

Caused by: java.lang.SecurityException: Uid 10075 does not have permission to uri 0 @ content://com.android.chrome.FileProvider/images/screenshot/6471932623902346234.jpg 

そして今、私の質問:私は、その許可例外を発生させることなくIntentを再送信するにはどうすればよい

どのように必要な権限を渡すことができますか?


注:私は本当に現在の活動を終えたとIntentを再送信すると、そのリダイレクト行動をしたい
。さまざまな理由から、アクティビティ(MainActivitySendActivity)をスタックに保存してからLoginActivityに戻すことはできません。

答えて

0

権限がActivity/Intentチェーンに沿って渡された場合LoginActivity作品にオリジナルIntentを再送信。これは、することによって達成することができます。

  1. redirect- Intentsは、元Intentのコピーです。
  2. 再送信する前に、Intentを明示します。たとえばSomeActivityについては

SomeActivityを開始するために使用されたIntentのコピーを使用してLoginActivityにリダイレクト:

Intent loginIntent = new Intent(getIntent()); // copy ... 
loginIntent.setClass(this, LoginActivity.class); // ... explicit now 
// maybe loginIntent.setAction(...) etc. 
loginIntent.putExtra(EXTRA_ORIGINAL_INTENT, getIntent()); 
finish(); 
startActivity(loginIntent); 

さて、ログイン成功後、LoginActivityはバックSomeActivityにリダイレクトすることができます。

Intent origIntent = getIntent().getParcelableExtra(EXTRA_ORIGINAL_INTENT); 
Intent redirectIntent = new Intent(origIntent); // copy ... 
redirectIntent.setClass(this, SomeActivity.class); // ... explicit now 
finish(); 
startActivity(redirectIntent); 
0

一般的に、欠けているものはFLAG_GRANT_READ_URI_PERMISSIONです。あなたが外部の第三者(ACTION_SEND上例えば、EXTRA_STREAM)からUriを取得すると

、あなたは、少なくともそのUriによって識別されるコンテンツの読み取り権限を付与する必要があります。それ自体でis a bit tricky to set upです。

ただし、許可許可はIntent(たとえば、ACTION_SENDに反応したあなたのアクティビティ)を受け取るコンポーネントにのみ許可されます。作業を他のもの(別のアクティビティ、サービスなど)に委任しようとすると、そのコンポーネントにはアクセス権が与えられません。だから、

、あなたはいくつかのオプションがあります。

一つではなく、別のアクティビティを開始すると、その場でを使用することができますフラグメントまたはUIの他のビットにあなたの認証/認可のものに変換することですが。これにより、ユーザーをすべて1か所に保つことができ、その場所にはコンテンツへの読み取りアクセス権が与えられます。

もう1つは、ユーザーをLoginActivityにリダイレクトする前にコンテンツを消費することです。

もう1つは、元のアクティビティがfinish()ではなく、LoginActivityFLAG_ACTIVITY_REORDER_TO_FRONTを使用して、元のアクティビティの既存のインスタンスをフォアグラウンドに戻すことです。理論的には、まだコンテンツへの読み込みアクセス権が必要です。あなたの問題は、元のインスタンスを破棄して新鮮なインスタンスを作成していることから来ています。新しいインスタンスには読み込みアクセス権がありません。

さらに別のアプローチは、LoginActivityIntentと、あなたは余分なEXTRA_ORIGINAL_INTENT経由で渡している後に、Intent両方にFLAG_GRANT_READ_URI_PERMISSIONを追加しようとするだろう。私の推測では、これはうまくいきません。

上記のテーマにばらつきがEXTRA_ORIGINAL_INTENTの元Intentを入れて、だけでなく、そのUriとかLoginActivityIntentのデータの面においてその抽出だけでなく、になり

Intent loginIntent = new Intent(this, LoginActivity.class); 
loginIntent.putExtra(EXTRA_ORIGINAL_INTENT, getIntent()); 
loginIntent.setData(getIntent().getData()); 
loginIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

LoginActivityおそらくまだ希望をのaddFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)EXTRA_ORIGINAL_INTENTから電話する必要があります。

基本的に、後者のシナリオでは、元のアクティビティがLoginActivityへの読み取りアクセスを許可するだけで、LoginActivityが元のアクティビティの新しいインスタンスに読み取りアクセス権を戻すことができます。

最後に、使用する元のアクティビティのどのインスタンスにもコンテンツへの読み取りアクセス権が必要です。また、アクセス権が与えられていることを前提に、インスタンスにそのアクセス権があることを確認する必要があります。

+0

あなたのアイデアをありがとう。私はすでにgrant-flagsを使って演奏し、データ/エクストラを明示的に設定しました。しかし、それは動作しませんでした。しかし、私は再送の意図がどのように働くかを考え出したと思う。今、リダイレクトするときに、正しいターゲットアクティビティクラス、たとえば 'SendActivity'を設定することで、インテントを明示的なインテントに"変換 "します。私はこの暗黙の意図を再送することは許されていないようですが、明示的な意図は期待通りに機能します。とにかくやりたかったのです;-) – Biggie

関連する問題