С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
Акыл
6 / 6 / 6
Регистрация: 22.03.2012
Сообщений: 128
1

Отлов работы диктофона

10.05.2013, 14:34. Просмотров 1450. Ответов 18
Метки нет (Все метки)

Приложение работает в фоновом режиме, и при включении диктофона должна выводить уведомление.
вот кусок кода:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void mainTask() {
        Runnable runnable = new Runnable() {
             
            @Override
            public void run() {
                int k=0;
                int indikator=0;
                Log.d(LOG_TAG, "onWork");
                indikator = mrec.getState();
                if (indikator==AudioRecord.STATE_INITIALIZED){
                    if (k==0){
                        Log.d(LOG_TAG, "TAKE IT");
                        createNotification();
                        addToDataBase();
                    
                    k=1;
                    }
                }
                else {
                    k=0;
                }
                mainTask();
            }
        };
        mHandler.postDelayed(runnable, 1000);
    }
Работа диктофона не палится, есть идеи почему?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2013, 14:34
Ответы с готовыми решениями:

Ошибка записи диктофона
В чем шутка юмора был рабочий код прошло 4 дня и перестал работать. Запись...

Запуск внешней программы и отлов ошибок ее работы
Я запускаю внешнюю программу. Она вылетает по ошибке. Можно отследить появление...

AVS Audio запись с диктофона
Скажите, как отредактировать запись с диктофона, мне нужно сделать по громче...

Форматирование диктофона, диск защищен от записи
Здравствуйте, уважаемые знатоки. Есть у меня диктофон Olympus VN-712PC При...

Нужны драйвера от диктофона toshiba dmr 420
Люди, хоть и не в тему - допоможите! не найду дрова для диктофона, а без дров...

18
jumb0jet
16 / 16 / 0
Регистрация: 08.05.2013
Сообщений: 40
10.05.2013, 15:35 2
Цитата Сообщение от Акыл Посмотреть сообщение
Работа диктофона не палится, есть идеи почему?
Скорее всего, потому что объект "Диктофон" не создан еще.

Какой статус тебе выдает вместо ожидаемого? Думаю что это поможет решить проблему быстрее.
1
Акыл
6 / 6 / 6
Регистрация: 22.03.2012
Сообщений: 128
10.05.2013, 15:41  [ТС] 3
диктофон создан в методе onCreate():
Java
1
2
3
4
bufferSize= AudioRecord.getMinBufferSize(samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT)*2;
        mrec=new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT, bufferSize);
0
jumb0jet
16 / 16 / 0
Регистрация: 08.05.2013
Сообщений: 40
10.05.2013, 15:44 4
Цитата Сообщение от Акыл Посмотреть сообщение
диктофон создан в методе onCreate():
А какой статус? Может быть он некорректно создан?
1
Акыл
6 / 6 / 6
Регистрация: 22.03.2012
Сообщений: 128
10.05.2013, 15:45  [ТС] 5
не могу его получить, секунду
0
jumb0jet
16 / 16 / 0
Регистрация: 08.05.2013
Сообщений: 40
10.05.2013, 15:49 6
Еще необходимо проверить сам bufferSize, возможо в нем проблема. Я не пойму зачем ты его умножаешь на 2. Что это за magic number?

Выполни еще такие проверки

Java
1
2
3
4
5
6
7
8
9
if(bufferSize == AudioRecord.ERROR) {
    Log.d("getMinBufferSize returned ERROR");
    return;
}
    
if(bufferSize == AudioRecord.ERROR_BAD_VALUE) {
   Log.d("getMinBufferSize returned ERROR_BAD_VALUE");
   return;
}
после того как получил значение для него.
0
Акыл
6 / 6 / 6
Регистрация: 22.03.2012
Сообщений: 128
10.05.2013, 16:01  [ТС] 7
Java
1
2
3
4
5
6
7
8
9
10
11
if(bufferSize == AudioRecord.ERROR)
        {
            Log.d(LOG_TAG, "getMinBufferSize returned ERROR");
            return;
        }
        
        if(bufferSize == AudioRecord.ERROR_BAD_VALUE)
        {
            Log.d(LOG_TAG, "getMinBufferSize returned ERROR_BAD_VALUE");
            return;
        }
Ничего не вернули

Добавлено через 2 минуты
05-10 11:57:12.034: E/AudioRecord(936): Could not get audio input for record source 1
05-10 11:57:12.034: E/AudioRecord-JNI(936): Error creating AudioRecord instance: initialization check failed.
2 ошибки в логах
0
jumb0jet
16 / 16 / 0
Регистрация: 08.05.2013
Сообщений: 40
10.05.2013, 16:46 8
Если не жалко скинь проект полностью, я гляну. Что там у тебя не так. Как видишь мое предположение оказалось верным, AudioRecord создавался не правильно.
1
Акыл
6 / 6 / 6
Регистрация: 22.03.2012
Сообщений: 128
10.05.2013, 16:51  [ТС] 9
0
jumb0jet
16 / 16 / 0
Регистрация: 08.05.2013
Сообщений: 40
10.05.2013, 17:10 10
Ну во первых ты не добавил в Manifest
XML
1
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Теперь AudioRecord создается верно, но стала сыпаться база данных. Сейчас еще глубже копну.
1
Акыл
6 / 6 / 6
Регистрация: 22.03.2012
Сообщений: 128
10.05.2013, 17:40  [ТС] 11
да, бд хз
0
jumb0jet
16 / 16 / 0
Регистрация: 08.05.2013
Сообщений: 40
10.05.2013, 17:46 12
Придется тебе поправить несколько методов:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void onCreate() {
        super.onCreate();
 
        Log.d(LOG_TAG, "onCreate");
 
        sqh = new DataBaseFunc(this);
        sqdb = sqh.getWritableDatabase();
 
        mHandler = new Handler();
 
        bufferSize = AudioRecord.getMinBufferSize(samplerate,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT);
 
        mrec = new AudioRecord(AudioSource.MIC, samplerate,
                AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                bufferSize * 10);
    }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void addToDataBase() {
        Log.d("TAG", ":: addToDataBase :: ");
        String insertQuery;
        ActivityManager am = (ActivityManager) this
                .getSystemService(ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        ComponentName componentInfo = taskInfo.get(0).topActivity;
 
        Log.d("TAG", componentInfo.getPackageName());
 
        insertQuery = "INSERT INTO " + DataBaseFunc.TABLE_NAME + " ( "
                + DataBaseFunc.TIME + ", " + DataBaseFunc.PACKAGE
                + " ) VALUES ( '" + getTimeAndDate() + "', '"
                + componentInfo.getPackageName() + "');";
        sqdb.execSQL(insertQuery);
    }
Все теперь работает как и должно, в базу пишет.
1
Акыл
6 / 6 / 6
Регистрация: 22.03.2012
Сообщений: 128
10.05.2013, 17:48  [ТС] 13
чувак, спасибо)

Добавлено через 7 секунд
большое)
0
jumb0jet
16 / 16 / 0
Регистрация: 08.05.2013
Сообщений: 40
10.05.2013, 17:49 14
Но так ты не сможешь отловить когда был запущен диктофон. Я вообще не до конца понял задачу. Ты сам, после того как создал объект AudioRecord можешь производить запись, но я не уверен что так можно перехватить какой-то другой диктофон.
1
Акыл
6 / 6 / 6
Регистрация: 22.03.2012
Сообщений: 128
10.05.2013, 18:01  [ТС] 15
да я уже это понял

Добавлено через 2 минуты
А если начать запись на диктофон, т.е. начинать и останавливать запись каждые 0,5 сек. можно что ли бо получить?
0
jumb0jet
16 / 16 / 0
Регистрация: 08.05.2013
Сообщений: 40
10.05.2013, 18:02 16
Есть конечно один способ. Реализуется довольно легко на основе твоего сервиса, но есть одна загвоздка - тебе необходимо знать имя пакета приложения "Диктофон".
В том месте где ты получаешь имя приложения, которое находится на фронте, ты можешь его прочекать, и если оно тебе подходит запускать показ уведомления.
1
Акыл
6 / 6 / 6
Регистрация: 22.03.2012
Сообщений: 128
10.05.2013, 18:08  [ТС] 17
суть в том, что я должен отлавливать любое приложение, которое запускает диктофон
0
jumb0jet
16 / 16 / 0
Регистрация: 08.05.2013
Сообщений: 40
10.05.2013, 18:18 18
Акыл, в программировании нет практически ничего невозможного, но к сожалению это нельзя реализовать (насколько мне известно).
1
Акыл
6 / 6 / 6
Регистрация: 22.03.2012
Сообщений: 128
10.05.2013, 20:32  [ТС] 19
спасибо в любом случае, буду искать.

Добавлено через 2 часа 11 минут
кто будет делать что похожее, я нашел выход:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void mainTask() {
        Runnable runnable = new Runnable() {
             
            @Override
            public void run() {
                int k=0;
                int indikator=0;
                Log.d(LOG_TAG, "onWork");
                mrec.startRecording();
                indikator = mrec.getRecordingState();
                if (indikator!=AudioRecord.RECORDSTATE_RECORDING){
                    if (k==0){
                        Log.d(LOG_TAG, "TAKE IT");
                        createNotification();
                        addToDataBase();
                    
                    k=1;
                    }
                }
                else {
                    k=0;
                }
                mrec.stop();
                mainTask();
            }
        };
        mHandler.postDelayed(runnable, 1000);
    }
0
10.05.2013, 20:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 20:32

Нужен рабочий исходник простого диктофона (через микрофон)
дайте плиз ссылку на готовую программу :sorry: заранее спс Добавлено через...

adc-dma Кольцевой буфер для стерео-диктофона с сжатием.
Здравствуйте! Перекладываю свою компьютерную программу на STM32F103RBT6....

Выбор диктофона для качественной записи голоса в разных условиях
Решил купить себе диктофон. Однако зашел в магазин, там столько диктофонов что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru