Как создать событие при подключении или отключении гарнитуры [duplicate]

Обход для будущих читателей.

Асинхронная загрузка файла

С помощью HTML5

Вы можете загружать файлы с помощью 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 ».

Fallback

Когда 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 в различные резервные копии и некоторые полезные функции для облегчения из процесса. В зависимости от ваших потребностей и требований вы можете захотеть рассмотреть голые версии или любой из этих плагинов.

22
задан Renato Lochetti 29 November 2012 в 15:23
поделиться

2 ответа

Как насчет этого вызова: 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, поэтому я заменил его на извлечение состояния из намерения трансляции. Возможно, что для каждого подключения или отсоединения может быть несколько трансляций, возможно, из-за контактного отката в разъеме.

73
ответ дан Community 24 August 2018 в 08:40
поделиться

Я не работал с этим, но если я читаю документы правильно, ACTION_AUDIO_BECOMING_NOISY предназначен для того, чтобы приложение узнало, что аудиовход может начать прослушивать аудиовыход. Когда вы отсоединяете гарнитуру, микрофон телефона может начать собирать динамик телефона, следовательно, сообщение.

С другой стороны, ACTION_SCO_AUDIO_STATE_UPDATED спроектирован так, чтобы вы знали, когда происходит изменение состояния соединения устройства Bluetooth.

Этот второй, вероятно, вы хотите слушать.

2
ответ дан Steve Blackwell 24 August 2018 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: