Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
#1

Widget + activity - Android

17.02.2014, 14:15. Просмотров 1282. Ответов 9
Метки нет (Все метки)

Добрый день!!! Создаю простенький виджет-диктофон и кнопка для открытия активити с настройками.

При нажатии на кнопку "rec" в каталоге "Music" создаётся файл "record.3gpp" и начинается запись звука в него.
При нажатии на кнопку "stop" запись останавливается.

Ошибка вываливается если:
1) нажать "rec"
2) нажать "Activity" - появится активити, затем закрыть это активити
3) нажать кнопку "stop"

Ошибка:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
02-17 16:07:15.858: D/AndroidRuntime(30704): Shutting down VM
02-17 16:07:15.858: W/dalvikvm(30704): threadid=1: thread exiting with uncaught exception (group=0x40dfd930)
02-17 16:07:15.858: E/AndroidRuntime(30704): FATAL EXCEPTION: main
02-17 16:07:15.858: E/AndroidRuntime(30704): java.lang.RuntimeException: Unable to start receiver com.example.mywidget.MyWidget: java.lang.NullPointerException
02-17 16:07:15.858: E/AndroidRuntime(30704):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2383)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at android.app.ActivityThread.access$1500(ActivityThread.java:141)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1310)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at android.os.Looper.loop(Looper.java:137)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at android.app.ActivityThread.main(ActivityThread.java:5039)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at java.lang.reflect.Method.invokeNative(Native Method)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at java.lang.reflect.Method.invoke(Method.java:511)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at dalvik.system.NativeStart.main(Native Method)
02-17 16:07:15.858: E/AndroidRuntime(30704): Caused by: java.lang.NullPointerException
02-17 16:07:15.858: E/AndroidRuntime(30704):    at com.example.mywidget.MyWidget.onReceive(MyWidget.java:67)
02-17 16:07:15.858: E/AndroidRuntime(30704):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2376)
02-17 16:07:15.858: E/AndroidRuntime(30704):    ... 10 more
Помогите разобраться с этой ошибкой, пожалуйста
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
17.02.2014, 14:18  [ТС]     Widget + activity #2
Вот код виджета и в приложении весь проект...

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.example.mywidget;
 
import java.util.Arrays;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;
 
public class MyWidget extends AppWidgetProvider {
 
    final String LOG_TAG = "myLogs";
    public static String action_b1 = "b1";
    public static String action_b2 = "b2";
    static MyClass myclass;
 
    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        Log.d(LOG_TAG, "onEnabled");
    }
 
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);        
        Log.d(LOG_TAG, "onUpdate " + Arrays.toString(appWidgetIds));
 
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
 
        //кнопка 1
        Intent b1 = new Intent(context, MyWidget.class);
        b1.setAction(action_b1);
        PendingIntent actionPendingIntent1 = PendingIntent.getBroadcast(context,    0, b1, 0);
        remoteViews.setOnClickPendingIntent(R.id.button1, actionPendingIntent1);
        
        //кнопка 2
        Intent b2 = new Intent(context, MyWidget.class);
        b2.setAction(action_b2);
        PendingIntent actionPendingIntent2 = PendingIntent.getBroadcast(context,    0, b2, 0);
        remoteViews.setOnClickPendingIntent(R.id.button2, actionPendingIntent2);
 
        //кнопка 3
        Intent b3 = new Intent(context, MainActivity.class);
        PendingIntent actionPendingIntent3 = PendingIntent.getActivity(context, 0, b3, 0);
        remoteViews.setOnClickPendingIntent(R.id.button3, actionPendingIntent3);
 
        //обновляем виджет
        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
    }
    
    @Override
    public void onReceive(final Context context, Intent intent) {
        final String action = intent.getAction();
        
        if (action_b1.equals(action)) {
            Toast.makeText(context, "action_b1", Toast.LENGTH_SHORT).show();
            myclass = new MyClass();
            myclass.recordStart();
        }
        
        if (action_b2.equals(action)) {
            Toast.makeText(context, "action_b2", Toast.LENGTH_SHORT).show();
            myclass.recordStop();
        }
        super.onReceive(context, intent);
    }
    
    public void UpdateGUI(Context context, RemoteViews remoteViews) {   
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        ComponentName thisWidget = new ComponentName(context, MyWidget.class);
        manager.updateAppWidget(thisWidget, remoteViews);
    }
    
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
        Log.d(LOG_TAG, "onDeleted " + Arrays.toString(appWidgetIds));
    }
 
    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        Log.d(LOG_TAG, "onDisabled");
    }
}
Вложения
Тип файла: rar MyWidget.rar (1.43 Мб, 16 просмотров)
angryrobot
Командир зеленых роботов
346 / 283 / 53
Регистрация: 08.10.2013
Сообщений: 564
17.02.2014, 14:19     Widget + activity #3
Цитата Сообщение от DevExp Посмотреть сообщение
Помогите разобраться с этой ошибкой, пожалуйста
В файле MyWidget.java на строчке 67 возникло исключение NullPointerException.
Показывайте код, без него даже Ванга не разберётся.

UPD. ага вижу код щас гляну
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
17.02.2014, 14:21  [ТС]     Widget + activity #4
Выложил и ещё класс диктофона

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.example.mywidget;
 
import java.io.File;
 
import android.media.MediaRecorder;
import android.os.Environment;
 
public class MyClass {
    int i = 0;
    MediaRecorder mediaRecorder;
    
    public MyClass() {
        i = 1;
    }
    
    public void recordStart() {
        try {
            File pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
            File outFile = new File(pictures, "record.3gpp");
            if (outFile.exists()) {
                outFile.delete();
            }
            outFile.createNewFile();
            
            mediaRecorder = new MediaRecorder();
            mediaRecorder.setAudioChannels(2);
            mediaRecorder.setAudioSamplingRate(48000);
            mediaRecorder.setAudioEncodingBitRate(48000);
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
            mediaRecorder.setOutputFile(outFile.getAbsolutePath());
            mediaRecorder.prepare();
            mediaRecorder.getMaxAmplitude();
            mediaRecorder.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public void recordStop() {
        //if (mediaRecorder != null) {
            mediaRecorder.stop();
            mediaRecorder.reset();
            mediaRecorder.release();
            mediaRecorder = null;
        //}
    }
}
angryrobot
Командир зеленых роботов
346 / 283 / 53
Регистрация: 08.10.2013
Сообщений: 564
17.02.2014, 16:05     Widget + activity #5
Цитата Сообщение от DevExp Посмотреть сообщение
Вот код виджета и в приложении весь проект
Пардон, не дочитал первый пост до конца. Щас запущу проект :-)

Такое чувство что вы после размещения виджета на экране сразу начинаете нажимать на "кнопка 2" где у вас происходит выполнение строчки
myclass.recordStop();
Но на этот момент переменная myclass равна null и из-за этого возникает NullPointerException. Эта переменная получает значение при нажатии "кнопка 1" поэтому тут два выхода:
1) Перенести строчку
myclass = new MyClass();
в более подходящее место
2) нажимать сначала "кнопка 1" а только потом уже "кнопка 2"
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
17.02.2014, 16:42  [ТС]     Widget + activity #6
Ошибка вываливается именно после закрытия активити (видимо класс становится равен null ???):

1) нажать "rec"
2) нажать "Activity" - появится активити, затем закрыть это активити (не свернуть а закрыть)
3) нажать кнопку "stop"

появляется ошибка...

Добавлено через 18 минут
Цитата Сообщение от angryrobot Посмотреть сообщение
1) Перенести строчку
myclass = new MyClass();
в более подходящее место
перенёс в onEnabled не помогло
angryrobot
Командир зеленых роботов
346 / 283 / 53
Регистрация: 08.10.2013
Сообщений: 564
17.02.2014, 18:07     Widget + activity #7
Цитата Сообщение от DevExp Посмотреть сообщение
Ошибка вываливается именно после закрытия активити (видимо класс становится равен null ???):
Я запустил ваш проект который вы приложили, и крэш возникает только когда два раза подряд нажимают кнопку стоп. (или нажимают стоп до старта) Если нажимать по порядку старт/стоп/старт/стоп то все работает. А сам крэш происходит из-за того что mediaRecorder становится null'ом в файле MyClass.java
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
17.02.2014, 18:17  [ТС]     Widget + activity #8
Большое спасибо!
У меня нет проверки класса на null это да.
Но если сначала нажать старт, а потом нажать кнопку3 и затем закрыть активити, а потом нажать стоп - то почему возникает ошибка? У меня такой вопрос

Добавлено через 5 минут
попробуйте пожалуйста именно эту последовательность нажатий:
1) нажать кнопку "rec"
2) нажать кнопку "Activity" - появится активити, затем закрыть это активити (не свернуть а закрыть)
3) нажать кнопку "stop"
angryrobot
Командир зеленых роботов
346 / 283 / 53
Регистрация: 08.10.2013
Сообщений: 564
17.02.2014, 19:04     Widget + activity #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от DevExp Посмотреть сообщение
попробуйте пожалуйста именно эту последовательность нажатий:
Попробовал. Тоже получил крэш с тем же стек трейсом. (myclass была равна null почему-то). ПОчему так происходит не знаю, рекомендую запись звука производить из сервиса, а через виджет просто управлять этим самым сервисом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.02.2014, 19:15     Widget + activity
Еще ссылки по теме:

AutoUpdate Widget Android
Android Файл не найден: Widget.obj
Custom Fonts in widget Android
Получение String из другого класса в Activity widget Android
Android Вывод activity в activity

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

Или воспользуйтесь поиском по форуму:
DevExp
6 / 6 / 2
Регистрация: 27.05.2013
Сообщений: 59
17.02.2014, 19:15  [ТС]     Widget + activity #10
Спасибо за помощь
Yandex
Объявления
17.02.2014, 19:15     Widget + activity
Ответ Создать тему
Опции темы

Текущее время: 13:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru