getAssets () из другого класса

Интерфейс, диалоги, темы, стили, меню
Ответить
o.m.k
Сообщения: 2
Зарегистрирован: 11 дек 2015, 02:20

getAssets () из другого класса

Сообщение o.m.k » 11 дек 2015, 02:27

Он работает с моей основной Activity и моей фрагмента. Но если я использую метод (LoadSound) в Sound класса, getAssets () не работает.
пожалуйста, помогите мне,заранее спасибо .

Код: Выделить всё

public class CarnivoreFragment extends Fragment {
 
    private int mCowSound;
    private View view;
 
    private ImageButton mCowImageButton;
 

    public CarnivoreFragment() {
    }
 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
 
        view = inflater.inflate(R.layout.fragment_carnivore, container, false);
 
        if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
 
            Sound.createOldSoundPool();
        } else {
            Sound.createNewSoundPool();
        }
 
        mCowSound = Sound.loadSound("cow.wav");
 
        mCowImageButton = (ImageButton) view.findViewById(R.id.imageButtonCow);
        mCowImageButton.setOnClickListener(onClickListener);
 
        return view;
    }
 
    View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.imageButtonCow:
                    Sound.playSound(mCowSound);
                    Toast.makeText(view.getContext(), "Cow", Toast.LENGTH_SHORT).show();
 
                    break;
 
            }
        }
    };
}

Код: Выделить всё

public class Sound {
 
    private  static SoundPool mSoundPool;
    private  static AssetManager mAssetManager;
    private  static int mStreamID;
    private  static Context context;
 

    public Sound(Context context) {
        this.context = context;
    }
 
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static void createNewSoundPool() {
        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_GAME)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build();
        mSoundPool = new SoundPool.Builder()
                .setAudioAttributes(attributes)
                .build();
    }
 
    @SuppressWarnings("deprecation")
    public static void createOldSoundPool() {
        mSoundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
    }
 
    public static int playSound(int sound) {
        if (sound > 0) {
            mStreamID = mSoundPool.play(sound, 1, 1, 1, 0, 1);
        }
        return mStreamID;
    }
 
    public static int loadSound(String fileName) {
        mAssetManager = context.getAssets();
        AssetFileDescriptor afd;
        try {
            afd = mAssetManager.openFd(fileName);
        } catch (IOException e) {
            e.printStackTrace();
              Toast.makeText(context, "Не могу загрузить файл " + fileName,
                    Toast.LENGTH_SHORT).show();
            return -1;
        }
        return mSoundPool.load(afd, 1);
    }
 

}

o.m.k
Сообщения: 2
Зарегистрирован: 11 дек 2015, 02:20

Re: getAssets () из другого класса

Сообщение o.m.k » 11 дек 2015, 17:10

ُEсли создание экземпляров класса не входит в алгоритм использования класса Sound (так как все поля и методы в нем статические), то мои методы не смогут получать контекст (так как конструктор не отрабатывает), который необходим для работы метода getAssets().

решение :
передавал контекст через параметры метода, в котором он требуется:

public static int loadSound(Context context, String fileName) {
mAssetManager = context.getAssets();
....
}
а потом вызвал из фрагмента:

mCowSound = Sound.loadSound(getActivity(), "cow.wav");

Ответить