java.lang.RuntimeException: Cannot initialize effect engine for type: 0bed4300-ffffd6-11db-8f34-0002a5d5c51b Error: -3

后端 未结 2 1207
借酒劲吻你
借酒劲吻你 2021-01-04 12:53

I am getting the following error in my equalizer app on Android MarshMellow, OnePlus.

java.lang.RuntimeException: Unable to start activity ComponentInfo{com         


        
相关标签:
2条回答
  • 2021-01-04 13:12

    The global audio session 0 is deprecated and can cause problems if you pass it to the Equalizer. See details in the doc https://developer.android.com/reference/android/media/audiofx/Equalizer

    To get rid the above-mentioned error just use a specific audio session id. Quick example:

    Equalizer equalizer = new Equalizer(0, new MediaPlayer().getAudioSessionId());

    0 讨论(0)
  • 2021-01-04 13:26

    It seems that the reason is EFFECT_TYPE_EQUALIZER. Read this Util, I think it will be useful for you:

    import android.annotation.TargetApi;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.ActivityInfo;
    import android.content.pm.PackageManager;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.media.MediaMetadataRetriever;
    import android.media.audiofx.AudioEffect;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.Build;
    
    import com.marverenic.music.instances.Song;
    import com.marverenic.music.player.PlayerController;
    
    import java.util.UUID;
    
    import timber.log.Timber;
    
    import static android.content.Context.CONNECTIVITY_SERVICE;
    
    public final class Util {
    
        /**
         * This UUID corresponds to the UUID of an Equalizer Audio Effect. It has been copied from
         * {@link AudioEffect#EFFECT_TYPE_EQUALIZER} for backwards compatibility since this field was
         * added in API level 18.
         */
        private static final UUID EQUALIZER_UUID;
    
        static {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
                EQUALIZER_UUID = AudioEffect.EFFECT_TYPE_EQUALIZER;
            } else {
                EQUALIZER_UUID = UUID.fromString("0bed4300-ffffd6-11db-8f34-0002a5d5c51b");
            }
        }
    
        /**
         * This class is never instantiated
         */
        private Util() {
    
        }
    
        /**
         * Checks whether the device is in a state where we're able to access the internet. If the
         * device is not connected to the internet, this will return {@code false}. If the device is
         * only connected to a mobile network, this will return {@code allowMobileNetwork}. If the
         * device is connected to an active WiFi network, this will return {@code true.}
         * @param context A context used to check the current network status
         * @param allowMobileNetwork Whether or not the user allows the application to use mobile
         *                           data. This is an internal implementation that is not enforced
         *                           by the system, but is exposed to the user in our app's settings.
         * @return Whether network calls should happen in the current connection state or not
         */
        @SuppressWarnings("SimplifiableIfStatement")
        public static boolean canAccessInternet(Context context, boolean allowMobileNetwork) {
            ConnectivityManager connectivityManager;
            connectivityManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
    
            NetworkInfo info = connectivityManager.getActiveNetworkInfo();
            if (info == null) {
                // No network connections are active
                return false;
            } else if (!info.isAvailable() || info.isRoaming()) {
                // The network isn't active, or is a roaming network
                return false;
            } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
                // If it's a mobile network, return the user preference
                return allowMobileNetwork;
            } else {
                // The network is a wifi network
                return true;
            }
        }
    
        @TargetApi(Build.VERSION_CODES.M)
        public static boolean hasPermission(Context context, String permission) {
            return context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
        }
    
        @TargetApi(Build.VERSION_CODES.M)
        public static boolean hasPermissions(Context context, String... permissions) {
            for (String permission : permissions) {
                if (!hasPermission(context, permission)) {
                    return false;
                }
            }
            return true;
        }
    
        public static Intent getSystemEqIntent(Context c) {
            Intent systemEq = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL);
            systemEq.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, c.getPackageName());
            systemEq.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, PlayerController.getAudioSessionId());
    
            ActivityInfo info = systemEq.resolveActivityInfo(c.getPackageManager(), 0);
            if (info != null && !info.name.startsWith("com.android.musicfx")) {
                return systemEq;
            } else {
                return null;
            }
        }
    
        /**
         * Checks whether the current device is capable of instantiating and using an
         * {@link android.media.audiofx.Equalizer}
         * @return True if an Equalizer may be used at runtime
         */
        public static boolean hasEqualizer() {
            for (AudioEffect.Descriptor effect : AudioEffect.queryEffects()) {
                if (EQUALIZER_UUID.equals(effect.type)) {
                    return true;
                }
            }
            return false;
        }
    
        public static Bitmap fetchFullArt(Song song) {
            if (song == null) {
                return null;
            }
    
            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    
            try {
                retriever.setDataSource(song.getLocation());
                byte[] stream = retriever.getEmbeddedPicture();
                if (stream != null) {
                    return BitmapFactory.decodeByteArray(stream, 0, stream.length);
                }
            } catch (Exception e) {
                Timber.e(e, "Failed to load full song artwork");
            }
            return null;
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题