Android, Samsung SDK Edge Single Plus, Broadcast Receiver работает нормально в течение некоторого времени, а затем завершает работу - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь создать пограничную панель для S9 плюс Android API 28, которая может контролировать громкость мультимедиа. Он работает правильно, но через некоторое время перестает отвечать. (5-10 минут Не уверен)

Я могу нажимать кнопки, но ничего не происходит. Если я отключу его в меню на боковой панели и снова включу, он исчезнет и не будет отображаться. Я должен переустановить его, чтобы он снова заработал. Я получил код из примеров, которые были предоставлены с Samsung SDK https://developer.samsung.com/galaxy/edge

Изображение Edge Panel https://imgur.com/s5a3yJl.jpg

Манифест Android

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.edgescreen"
    android:versionCode="1"
    android:versionName="1.0">


    <uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">


        <receiver android:name=".singleplus.LongClickCocktailProvider">
            <intent-filter>
                <action android:name="com.samsung.android.cocktail.v2.action.COCKTAIL_UPDATE" />
                <action android:name="com.example.cocktailslooksample.action.ACTION_REMOTE_CLICK" />
            </intent-filter>

            <meta-data
                android:name="com.samsung.android.cocktail.provider"
                android:resource="@xml/edge_single_plus_list" />
        </receiver>

    </application>

</manifest>

Класс приемника вещания

public class LongClickCocktailProvider extends SlookCocktailProvider {

    private static final String TAG = LongClickCocktailProvider.class.getSimpleName();
    private static final String ACTION_REMOTE_CLICK = "com.example.cocktailslooksample.action.ACTION_REMOTE_CLICK";

    private static RemoteViews mLongClickStateView = null;

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        String action = intent.getAction();
        Log.d(TAG, "onReceive: " + action);
        switch (action) {

            case ACTION_REMOTE_CLICK:
                performRemoteClick(context, intent);
                break;
            default:
                break;
        }
    }

    @Override
    public void onUpdate(Context context, SlookCocktailManager cocktailManager,
                         int[] cocktailIds) {

        if (mLongClickStateView == null) {
            mLongClickStateView = createStateView(context);
        }
        cocktailManager.updateCocktail(cocktailIds[0], mLongClickStateView);
    }

    public void update_edge(Context context) {

        SlookCocktailManager cocktailManager = SlookCocktailManager.getInstance(context);
        int[] cocktailIds = cocktailManager.getCocktailIds(new ComponentName(context, LongClickCocktailProvider.class));
        cocktailManager.updateCocktail(cocktailIds[0], mLongClickStateView);


    }


    private RemoteViews createStateView(Context context) {
        RemoteViews stateView = new RemoteViews(context.getPackageName(),
                R.layout.sample_edge_single_plus);
        stateView.setOnClickPendingIntent(R.id.volumeD, getClickIntent(context, R.id.volumeD, 0));
        stateView.setOnClickPendingIntent(R.id.volumeU, getClickIntent(context, R.id.volumeU, 0));
        stateView.setOnClickPendingIntent(R.id.muteBt, getClickIntent(context, R.id.muteBt, 0));
        stateView.setOnClickPendingIntent(R.id.defBt, getClickIntent(context, R.id.defBt, 0));
        int level;
        float vol;
        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        level = am.getStreamVolume(AudioManager.STREAM_MUSIC);
        vol = ((float) level / 15) * 100;
        level = (int) vol;
        stateView.setTextViewText(R.id.vlvl, level + "%");
        return stateView;
    }


    private PendingIntent getClickIntent(Context context, int id, int key) {
        Intent clickIntent = new Intent(ACTION_REMOTE_CLICK);
        clickIntent.putExtra("id", id);
        clickIntent.putExtra("key", key);
        PendingIntent pIntent = PendingIntent.getBroadcast(context, id, clickIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        return pIntent;
    }

    private void performRemoteClick(Context context, Intent intent) {
        int id = intent.getIntExtra("id", -1);
        AudioManager am;
        int level;
        float vol;
        switch (id) {
            case R.id.volumeU:
                am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
                am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND);
                level = am.getStreamVolume(AudioManager.STREAM_MUSIC);
                vol = ((float) level / 15) * 100;
                level = (int) vol;
                mLongClickStateView.setTextViewText(R.id.vlvl, level + "%");
                update_edge(context);
                break;
            case R.id.volumeD:
                am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
                am.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND);
                level = am.getStreamVolume(AudioManager.STREAM_MUSIC);
                vol = ((float) level / 15) * 100;
                level = (int) vol;
                mLongClickStateView.setTextViewText(R.id.vlvl, level + "%");
                update_edge(context);
                break;

            case R.id.muteBt:
                am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
                am.setStreamVolume(AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_PLAY_SOUND);
                level = am.getStreamVolume(AudioManager.STREAM_MUSIC);
                vol = ((float) level / 15) * 100;
                level = (int) vol;
                mLongClickStateView.setTextViewText(R.id.vlvl, level + "%");
                update_edge(context);
                break;

            case R.id.defBt:
                am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
                am.setStreamVolume(AudioManager.STREAM_MUSIC, 10, AudioManager.FLAG_PLAY_SOUND);
                level = am.getStreamVolume(AudioManager.STREAM_MUSIC);
                vol = ((float) level / 15) * 100;
                level = (int) vol;
                mLongClickStateView.setTextViewText(R.id.vlvl, level + "%");
                update_edge(context);
                break;

            default:
                break;
        }
    }
}
...