Обход для будущих читателей.
Вы можете загружать файлы с помощью jQuery с помощью метода $.ajax()
, если Поддерживаются форматыDataData и API файлов (обе функции HTML5).
Вы также можете отправлять файлы без FormData , но в любом случае API файлов должен присутствовать для обработки файлов таким образом, чтобы их можно было отправить с помощью XMLHttpRequest (Ajax).
$.ajax({
url: 'file/destination.html',
type: 'POST',
data: new FormData($('#formWithFiles')[0]), // The form with the file inputs.
processData: false,
contentType: false // Using FormData, no need to process data.
}).done(function(){
console.log("Success: Files sent!");
}).fail(function(){
console.log("An error occurred, the files couldn't be sent!");
});
Для быстрого, чистого примера JavaScript (без jQuery) см. « Отправка файлов с использованием объекта FormData ».
Когда HTML5 не поддерживается (нет File API ), единственное другое чистое решение для JavaScript (нет Flash или любого другого плагина браузера) - это скрытая техника iframe, которая позволяет эмулировать асинхронный запрос без использования объекта XMLHttpRequest .
Он состоит из установки iframe в качестве цели формы с входными файлами. Когда пользователь отправляет запрос, и файлы загружаются, но ответ отображается внутри iframe вместо повторной рендеринга главной страницы. Скрытие iframe делает весь процесс прозрачным для пользователя и эмулирует асинхронный запрос.
Если все сделано правильно, оно должно работать практически в любом браузере, но в нем есть некоторые предостережения о том, как получить ответ от iframe.
В этом случае вы можете предпочесть использовать плагин-оболочку, такой как Bifröst , который использует технику iframe , но также предоставляет jQuery Ajax transport , позволяющий отправлять файлы только с помощью метода $.ajax()
следующим образом:
$.ajax({
url: 'file/destination.html',
type: 'POST',
// Set the transport to use (iframe means to use Bifröst)
// and the expected data type (json in this case).
dataType: 'iframe json',
fileInputs: $('input[type="file"]'), // The file inputs containing the files to send.
data: { msg: 'Some extra data you might need.'}
}).done(function(){
console.log("Success: Files sent!");
}).fail(function(){
console.log("An error occurred, the files couldn't be sent!");
});
Bifröst - это всего лишь небольшая обертка, которая добавляет резервная поддержка метода ajax jQuery, но многие из вышеупомянутых плагинов, таких как jQuery Form Plugin или jQuery File Upload , включают весь стек из HTML5 в различные резервные копии и некоторые полезные функции для облегчения из процесса. В зависимости от ваших потребностей и требований вы можете захотеть рассмотреть голые версии или любой из этих плагинов.
Как насчет этого вызова: http://developer.android.com/reference/android/content/Intent.html#ACTION_HEADSET_PLUG , который я нашел в Droid Incredible Headphones Detection ]?
Обновленного кода, который я вижу в вашем вопросе, сейчас недостаточно. Эта трансляция происходит, когда включенное состояние изменяется, а иногда, когда это не так, согласно Intent.ACTION_HEADSET_PLUG принимается при запуске активности , поэтому я бы написал:
package com.example.testmbr;
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private MusicIntentReceiver myReceiver;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver = new MusicIntentReceiver();
}
@Override public void onResume() {
IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
registerReceiver(myReceiver, filter);
super.onResume();
}
private class MusicIntentReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
int state = intent.getIntExtra("state", -1);
switch (state) {
case 0:
Log.d(TAG, "Headset is unplugged");
break;
case 1:
Log.d(TAG, "Headset is plugged");
break;
default:
Log.d(TAG, "I have no idea what the headset state is");
}
}
}
}
@Override public void onPause() {
unregisterReceiver(myReceiver);
super.onPause();
}
}
Вызов AudioManager.isWiredHeadsetOn (), который я ранее рекомендовал, оказывается устаревшим после API 14, поэтому я заменил его на извлечение состояния из намерения трансляции. Возможно, что для каждого подключения или отсоединения может быть несколько трансляций, возможно, из-за контактного отката в разъеме.
Я не работал с этим, но если я читаю документы правильно, ACTION_AUDIO_BECOMING_NOISY
предназначен для того, чтобы приложение узнало, что аудиовход может начать прослушивать аудиовыход. Когда вы отсоединяете гарнитуру, микрофон телефона может начать собирать динамик телефона, следовательно, сообщение.
С другой стороны, ACTION_SCO_AUDIO_STATE_UPDATED
спроектирован так, чтобы вы знали, когда происходит изменение состояния соединения устройства Bluetooth.
Этот второй, вероятно, вы хотите слушать.