2011-02-02 43 views
7

私は奇妙な問題に遭遇しました。 Bluetoothが既に起動されているかどうかBluetoothのアクティブ化画面の回転後のアラートダイアログの乗算

Intent activateBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
startActivityForResult(activateBTIntent, BT_ACTIVATE_INTENT);         

が、私はそれに関係なく使用:アクティビティONSTART()私は意図を経由してBluetoothの活性化と120Sの見つけやすさを要求から。 Androidのドキュメントによれば、Bluetoothが起動していない場合は起動され、正常に動作しています。私は私がちらつく観察画面を回転すると、両方のケースでは、私は、システムの警告ダイアログ

enter image description here

を取得します。はい/いいえを押すと1つのダイアログが削除されますが、下にもう1つあります。画面の回転の実行警告ダイアログボックスが表示され、それぞれを削除するにはYes/Noを押す必要があります。

説明された問題は、意図が送信された時点でBluetoothが起動していない場合にのみ表示され、それ以外の場合は正常に動作します。別の2.2の電話で試して、問題はすべてに存在します。 Androidシステムの問題のように私に見えます。

誰もがそれに遭遇しましたが、これを回避するにはいくつかの有用なヒントがありますか?

ありがとうございます。

答えて

2

これは、これを引き起こす設定アプリのバグです。 RequestPermissionActivityは、ローテーションでRequestPermissionHelperActivityのインスタンスを複製しています。

+0

ありがとうございました。私はこれを非常に長い間探してきました。乾杯。 – Zelimir

0

(あなたの投稿は、ほぼ十分な情報を持っていないので、私はここと仮定しています...)

私はstartActivityForResultについてあまりよく分かりません。

管理対象のAlertDialogを使用する場合は、onCreate()にshowDialog()を実行しないでください。もしBluetoothのことであれば、onCreate()から上記のコードを実行しないでください。

+0

私の投稿をより正確に更新しました。提案ありがとう。インテントはonStart()から送信され、原因ではありません。 – Zelimir

1

私は同じ問題に直面していました。それに多くの時間を費やした後、私は1つの解決策を見つけました。

あなたはactivateBTIntentため FLAG_ACTIVITY_NO_HISTORYフラグを使用して「Bluetoothの活性化の警告]ダイアログ」の重複を避けることができます。 このフラグを設定すると、startActivityForResultは使用できなくなります

コード -

Intent activateBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
activateBTIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(activateBTIntent); 

activateBTIntentとFLAG_ACTIVITY_NO_HISTORYを使用すると、履歴スタックから「Bluetoothの活性化の警告ダイアログの活動を削除します。したがって、この場合には、向きが変更された場合、(重複しない) "Bluetoothの活性化の警告ダイアログの活動が終了され、newelが作成:

リファレンス http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_HISTORY

+1

通常、startActivityForResult()を使用する必要があります。そうすることで、システムのBluetooth起動アラートが表示されたときにユーザーが[はい]または[いいえ]を押したかどうかが通知されます。ユーザーが「いいえ」を選択した場合はどうしますか?あなたが試してみてください。 Bluetoothインテントを開始するアクティビティをポートレートのみ(マニフェスト内)に制限します。多分あなたはその問題を避けるでしょう。あなたは両方の向きを処理する必要があり、縦/横の異なるレイアウトを提示する必要があるなら、私の提案は役に立たない。 – Zelimir

+0

@Zelimirあなたは正しく働いています。ユーザーが[はい]をクリックすると、Bluetoothが有効になり、[いいえ]をクリックするとBluetooth Bluetoothが無効のままになります。 onActivityResultを使用して何らかの操作を実行しているときにのみ問題が発生します。 – Vivek

+0

はい、それは私が直面した問題でした。私のさらなる行動は、ユーザーのYes/No選択に依存していました。しかし、それがあなたにとって重要でない場合、私はあなたが解決策を持っていることに同意します。 – Zelimir

0

問題は(goggle issue tracker)が報告されているが、それ6年後に既に公開されています(Android 7.1.2で確認済み)。

残念ながら、フラグFLAG_ACTIVITY_NO_HISTORYはもう動作しません。

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); 

がちょうど

前に呼び出される:(彼らはこれまでする場合)、活動画面の向きの変更をロックすることであるAndroidのチームはちょうどダイアログが表示された時間のために、この問題を解決するまで、唯一の迅速な回避策Iが見つかりました。その後、
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 

と意図結果に

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_ENABLE_BT) { 
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

を使用しています。 これは一時的な対策ですが、通常はBTの有効化中にこの問題を示すよりも優れています。

関連する問題