Android openFileChooser onCreate() вызывается после onActivityResult()
У меня есть веб-просмотр, и на одной из страниц есть кнопка "Загрузить фото". Я нашел некоторый код для реализации выбора файлов (Android, почему так сложно????), и если я выбираю галерею, все работает нормально. Если я выберу камеру 1 из 10 раз, это работает. Но большую часть времени, когда я делаю снимок и нажимаю кнопку "Сохранить" (это все относится к работе с камерой), веб-просмотр загружает первую страницу, загруженную при запуске приложения. Кажется, что onActivityResult()
не называется, но вместо этого onCreate()
и это портит мое приложение. Можете ли вы дать мне пример того, как восстановить состояние webView после того, как я сделаю снимок? (возможно, я должен упомянуть, что я вошел в WebView).
Это класс WebChromeClient:
public class WebViewChromeClient extends WebChromeClient {
private Activity activity;
public Uri imageUri;
private static final int FILECHOOSER_RESULTCODE = 1;
private Uri mCapturedImageURI = null;
private Context context;
private MainActivity mainActivity;
public WebViewChromeClient(Context context, Activity activity,
MainActivity mainActivity) {
this.activity = activity;
this.context = context;
this.mainActivity = mainActivity;
}
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
// Update message
((Audi) activity.getApplication()).setmUploadMessage(uploadMsg);
if (uploadMsg == null) {
Log.d("UPLOAD MESSAGE", "NULL");
}
try {
File imageStorageDir = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"AndroidExampleFolder");
if (!imageStorageDir.exists()) {
// Create AndroidExampleFolder at sdcard
imageStorageDir.mkdirs();
}
// Create camera captured image file path and name
File file = new File(imageStorageDir + File.separator + "IMG_"
+ String.valueOf(System.currentTimeMillis()) + ".jpg");
mCapturedImageURI = Uri.fromFile(file);
mainActivity.setmCapturedImageURI(mCapturedImageURI);
Log.d("Line", "57");
// Camera capture image intent
final Intent captureIntent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
mainActivity.setmCapturedImageURI(mCapturedImageURI);
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
// Create file chooser intent
Intent chooserIntent = Intent.createChooser(i, "Image Chooser");
// Set camera intent to file chooser
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
new Parcelable[] { captureIntent });
// On select image call onActivityResult method of activity
activity.startActivityForResult(chooserIntent,
FILECHOOSER_RESULTCODE);
} catch (Exception e) {
Toast.makeText(context, "Exception:" + e, Toast.LENGTH_LONG).show();
}
}
// openFileChooser for Android < 3.0
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooser(uploadMsg, "");
}
// openFileChooser for other Android versions
public void openFileChooser(ValueCallback<Uri> uploadMsg,
String acceptType, String capture) {
openFileChooser(uploadMsg, acceptType);
}
// The webPage has 2 filechoosers and will send a
// console message informing what action to perform,android wml_siso init
// taking a photo or updating the file
public boolean onConsoleMessage(ConsoleMessage cm) {
onConsoleMessage(cm.message(), cm.lineNumber(), cm.sourceId());
return true;
}
public void onConsoleMessage(String message, int lineNumber, String sourceID) {
Log.d("androidruntime", "Show console messages, Used for debugging: "
+ message);
}
}
И это метод onActivityResult:
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
webView.requestFocus();
if (requestCode == FILECHOOSER_RESULTCODE) {
Log.d("MainActivity", "onActivityResult");
if (null == ((Audi) getApplication()).getmUploadMessage()) {
Log.d("FileChooser Result", "58");
return;
}
Log.d("MainActivity", "onActivityResult");
Uri result = null;
try {
if (resultCode != RESULT_OK) {
result = null;
} else {
// retrieve from the private variable if the intent is null
result = intent == null ? mCapturedImageURI : intent
.getData();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "activity :" + e,
Toast.LENGTH_LONG).show();
}
((Audi) getApplication()).getmUploadMessage().onReceiveValue(result);
((Audi) getApplication()).setmUploadMessage(null);
}
Log.d("MainActivity", "onActivityResult");
}
3 ответа
Исправлено добавлением этой строки в Манифест android:configChanges="keyboardHidden|orientation|screenSize"
Ваша активность, вероятно, приостановлена / остановлена системой, пока вы запускаете средство выбора файлов.
Вы должны справиться onResume()
и восстановить предыдущее состояние вашей деятельности. onResume
Метод вызывается при перезапуске вашей деятельности, так что это хорошее место для перезагрузки любого WebView, который вы отображали до запуска средства выбора файлов.
Глядя на ваш размещенный код, вот опасная строка:
webView.requestFocus();
первый в onActivityResult()
, Если MainActivity воссоздается, это может вызвать исключение NullPointerException. Система без проблем перезапустит ваше приложение, возможно, с сообщением о поведении.
Добавьте еще один Log.d() в начало onActivityResult()
, поместите try/catch вокруг этой опасной строки и используйте onSaveInstanceState() и onRestoreInstanceState().
Обратите внимание, что если у вас MainActivity " Портрет", вы столкнетесь с дополнительными проблемами, так как приложение "Камера" заставит альбомную ориентацию.