ボタン(スキャン用)とwebviewコンポーネントを備えたAndroidアプリを作成しました。button_scan が押されている場合、startActivityForResult を実行してアクティビティ zxing を呼び出し、バーコードと QR コードをスキャンします。zxing が終了したら、onActivityResult を記述してデータを処理します。
このアプリは今のところ Android V2.2.2 で問題なく動作しており、例外は発生していません。
ただし、このアプリを Android V2.3 または V4.0.4 で実行すると、例外 (java.lang.RuntimeException: Unable to resume activity) が発生します。この例外は、onActivityResult が呼び出されたときに発生します。
テスト用にグローバル変数 (CURRENTWEBPAGE) を出力したところ、startActivityForResult を呼び出す前に CURRENTWEBPAGE に値があり、onActivityResult が呼び出された後は CURRENTWEBPAGE が null であることがわかりました。
この場合、android のバージョンが問題になるかどうかに興味があります。すべてのグローバルメンバーがクリアされますか?
この状況に遭遇した人で、この問題を解決するための解決策を教えてもらえますか?
さらに必要な情報がありましたら、お気軽にお知らせください。
返信をお待ちしております。
以下は私のアプリコードです。
public class MyApp extends Activity
{
private String CURRENTWEBPAGE;//which will be set value whenvever webview changed.
private WebView webView_main;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
initActivity_web();
...
...
}
public void initActivity_web()
{
// add Listener to button_SCAN
((Button) findViewById(R.id.button_SCAN)).setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0)
{
try
{
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
Log.d(this.getClass().getName(),CURRENTWEBPAGE);
// CURRENTWEBPAGE has value here.
startActivityForResult(intent, 0);
}
catch (android.content.ActivityNotFoundException ex)
{
Toast popup = Toast.makeText(NEOMove.this, "Please install Zxing Barcode Scanner", Toast.LENGTH_SHORT);
popup.show();
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent)
{
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == 0)
{
if (resultCode == RESULT_OK)
{
String QRCodeContent = intent.getStringExtra("SCAN_RESULT");
String newURL = convertToLCMOBILESUPPORTActionUrl(CURRENTWEBPAGE);//exception occur
//because CURRENTWEBPAGE = null;
//java.lang.RuntimeException: Unable to resume activity
webView_main.loadUrl(newURL + QRCodeContent);
}
else if (resultCode == RESULT_CANCELED)
{
// TODO Handle cancel
}
}
}
}
追記 -- 2012/09/20
こんにちは、親アプリ (My App) の onCreate が onActivityResult の前に呼び出されることを発見しました。これらの変数を SharedPreferences に保持しているにもかかわらず、MyApp の webview は新しいセッション ID で再作成されます。バーコードをスキャンした後、破棄された webview のキャッシュにログインした許可を使用してリクエストを送信する必要があるため、これは機能しません。親アプリが破壊されないようにする方法はありますか?
以下は私の AndroidManifest.xml です。
<activity
android:name=".MyApp"
android:configChanges="orientation|keyboard"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>