首页 > 解决方案 > 当我点击下一首歌时,我的搜索栏有时会更新,有时不会。我没有得到我的代码中的错误可能是使用搜索栏

问题描述

  **Main Activity.java**

这是我实例化所有方法/对象的主要活动。在这里,我使用 Dexter 库从用户的外部存储中获取文件,然后我制作了一种称为查找歌曲的方法,该方法有助于查找文件的路径并相应地列出它们。然后我做了另一种称为显示歌曲的方法,这将有助于获取歌曲的整体大小,然后相应地显示整个列表及其名称。然后在自定义适配器的帮助下,我通过了名为 item 的数组中的歌曲列表。

   public class MainActivity extends AppCompatActivity {
   ListView listView;
   String [] items;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView = findViewById(R.id.listViewSong);
    runtimePermission();

   }
  public void runtimePermission(){
    Dexter.withContext(this)
            





   .withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE,Manifest
   .permissi 
    on.RECORD_AUDIO)
            .withListener(new MultiplePermissionsListener() {
                @RequiresApi(api = Build.VERSION_CODES.R)
                @Override
                public void 
    onPermissionsChecked(MultiplePermissionsReport 
       multiplePermissionsReport) 
   {
                    displaySongs();
                }

                @Override
                public void 
   onPermissionRationaleShouldBeShown(List<PermissionRequest> list, 
   PermissionToken permissionToken) {
                    permissionToken.continuePermissionRequest();
                }
            }).check();
   }
    public ArrayList<File> findSong(File file){
    ArrayList arrayList = new ArrayList();
    Log.d(TAG, "findSong:"+ file.getPath());

    File [] files = file.listFiles();

    if (files!=null) {
        Log.d(TAG, "findSong:"+ files.length);
        for (File singleFile : files) {
            if (singleFile.isDirectory() && !singleFile.isHidden()) {
                arrayList.addAll(findSong(singleFile));
            } else {
                if (singleFile.getName().endsWith(".mp3") &&
                        !singleFile.getName().startsWith(".")) {
                    arrayList.add(singleFile);
                }
            }
        }
    }
    return arrayList;
  }


     public void displaySongs(){
     ArrayList<File> mySongs = 
    findSong(Environment.getExternalStorageDirectory());
    String [] items = new String [mySongs.size()];
     if(mySongs == null)return; // this is very important function 
    otherwise app will crash

    for (int i=0; i<mySongs.size(); i++){
        items[i] = mySongs.get(i).getName().replace(".mp3",
                "");
      }
      Log.d(TAG, "displaySongs:"+ items.length);
 
    (this, 
   android.R.layout.simple_list_item_1,items);

    CustomAdapter customAdapter = new CustomAdapter(this, 
   Arrays.asList(items));
    Log.d(TAG, "displaySongs:"+ customAdapter.getCount());
    listView.setAdapter(customAdapter);

    listView.setOnItemClickListener(new 
   AdapterView.OnItemClickListener() {
         @Override
        public void onItemClick(AdapterView<?> parent, View view, int 
   position, long id) {
              String currentSong = (String) 
   listView.getItemAtPosition(position);
            startActivity(new Intent(getApplicationContext(), 
   PlayerActivity.class)
                     .putExtra("currentSong", currentSong)
                    .putExtra("position",position)
                    .putExtra("songs",mySongs));


        }
    });
   }
   class CustomAdapter extends ArrayAdapter {

    public android.util.Log Log;
    List<String> names;
    LayoutInflater inflater;
    Context context;
    public CustomAdapter(Context context,  List<String> names) {
        super(context,R.layout.list_item ,names);
        this.names=names;
        this.context=context;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup 
    parent) {


        inflater=LayoutInflater.from(getContext()); //inflater is 
    responsible for taking your xml files that defines your layout
       // and converting them into view objects.
        View 
   customview=inflater.inflate(R.layout.list_item,parent,false);
        String data=names.get(position);
        //String data1=names.get(position+1);
        TextView tv= 
    (TextView)customview.findViewById(R.id.textsongname);
        tv.setText(data);
        tv.setSelected(true);
        //TextView tv1=(TextView)customview.findViewById(R.id.TeamB);
        //tv1.setText(data1);
        return customview;
    }




    }

  }

  **PlayerActivity.java**

 

我尝试创建一个名为 update seek bar 的线程,在我将 set 应用于单击栏更改侦听器之后,它将更新我的搜索栏到当前位置,以便每当用户更新侧边栏的位置时它应该得到更新。但是这里的错误是,当我在模拟器上使用此代码运行我的应用程序时,它的工作完全正常,但是当安装在我的手机中时,会出现 2 个错误。歌曲完成后,它不会自动跳到下一首歌曲,其次当用户更新侧边栏并按下下一步时,侧边栏不会到达位置 0,并且整个错误显示在我的手机上,而不是在模拟器中。

    public class PlayerActivity extends AppCompatActivity {
    Button play,next,fastforward, previous, fastrewind;
    TextView txtsn, txtsstart, txtsstop;
    SeekBar seekBar;
    BarVisualizer visualizer;
    Thread updateSeekBar;
    String sName;
    public static final String EXTRA_NAME = "song_name";
      static MediaPlayer mediaPlayer;
    int position;
    ArrayList mySongs;
    ImageView imageView;

        @Override
         public boolean onOptionsItemSelected(@NonNull MenuItem item) {
             if (item.getItemId()== android.R.id.home){
           onBackPressed();
             }
              return super.onOptionsItemSelected(item);

       }

   @Override
    protected void onDestroy() {
       if (visualizer != null){
           visualizer.release();
       }
        super.onDestroy();
    }

     @Override
     protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_player);

        getSupportActionBar().setTitle("Now Playing");
        getSupportActionBar().setDisplayShowHomeEnabled(true);
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);

       play = findViewById(R.id.play);
       next = findViewById(R.id.next);
       previous = findViewById(R.id.previous);
       fastforward = findViewById(R.id.fastforward);
       fastrewind = findViewById(R.id.fastrewind);
        txtsn = findViewById(R.id.txtsn);
       txtsstart = findViewById(R.id.txtsstart);
       txtsstop = findViewById(R.id.txtsstop);
       seekBar = findViewById(R.id.seekbar);
       visualizer = findViewById(R.id.blast);
       imageView = findViewById(R.id.iamgeView);
       if (mediaPlayer != null){
           mediaPlayer.stop();
           mediaPlayer.release();
         }
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();

        mySongs = (ArrayList) bundle.getParcelableArrayList("songs");
       sName = intent.getStringExtra("currentSong");
       position = bundle.getInt("position",0);
       txtsn.setText(sName);
       txtsn.setSelected(true);
       Uri uri = Uri.parse(mySongs.get(position).toString());  // uri is 
       usually use tell a content provider what we want to access by 
        reference
        mediaPlayer = MediaPlayer.create(this,uri);
        mediaPlayer.start();
        seekBar.setMax(mediaPlayer.getDuration());

             updateSeekBar = new Thread(){
                  @Override
                   public void run() {
                        int currentPosition = 0;
                 while (currentPosition<mediaPlayer.getDuration()){
                try {
                    currentPosition = mediaPlayer.getCurrentPosition();
                    seekBar.setProgress(currentPosition);
                    sleep(500);
                }
                catch (Exception e) {
                    e.printStackTrace();
                                   }
                             }
                      }
                 };
             updateSeekBar.start();

 
               seekBar.setOnSeekBarChangeListener(new 
              SeekBar.OnSeekBarChangeListener() {
        @Override
            public void onProgressChanged(SeekBar seekBar, int progress, 
          boolean fromUser) {

          }

          @Override
          public void onStartTrackingTouch(SeekBar seekBar) {

                     }

                   @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
               mediaPlayer.seekTo(seekBar.getProgress());
                    }
               });

                String endTime = createTime(mediaPlayer.getDuration());
           txtsstop.setText(endTime);
           final Handler handler = new Handler();
            final int delay = 1000;
           handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            String currentTime = 
            createTime(mediaPlayer.getCurrentPosition());
            txtsstart.setText(currentTime);
            handler.postDelayed(this,delay);
        }
               },delay);

               play.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                if (mediaPlayer.isPlaying()){
                 play.setBackgroundResource(R.drawable.ic_play);
                mediaPlayer.pause();
            }
            else {
                play.setBackgroundResource(R.drawable.ic_pause);
                mediaPlayer.start();
                         }
                      }
               });

            next.setOnClickListener(new View.OnClickListener() {
              @Override
                   public void onClick(View v) {
            mediaPlayer.stop();
            mediaPlayer.release();
            if(position!=mySongs.size()-1){
                position = position + 1;
            }
            else{
                position = 0;
            }

            Uri uri = Uri.parse(mySongs.get(position).toString());
            mediaPlayer = MediaPlayer.create(getApplicationContext(), 
            uri);
            sName = mySongs.get(position).toString();
            txtsn.setText(sName);
            mediaPlayer.start();
            play.setBackgroundResource(R.drawable.ic_pause);
            seekBar.setMax(mediaPlayer.getDuration());
            startAnimation(imageView);
            int audiosessionId = mediaPlayer.getAudioSessionId();
            if(audiosessionId!= -1){
                          visualizer.setAudioSessionId(audiosessionId);
                          }

                   }
              });
 

                mediaPlayer.setOnCompletionListener(new 
                MediaPlayer.OnCompletionListener() {
                      @Override
                     public void onCompletion(MediaPlayer mp) {
                     next.performClick();
                         }
                       });

               int audiosessionId = mediaPlayer.getAudioSessionId();
              if(audiosessionId!= -1){
                visualizer.setAudioSessionId(audiosessionId);
                }


               previous.setOnClickListener(new View.OnClickListener() {
                @Override
                 public void onClick(View v) {
                    mediaPlayer.stop();
                  mediaPlayer.release();
                   if(position!=0){
                     position = position - 1;
                       }
            else{
                position = mySongs.size() - 1;
            }
            Uri uri = Uri.parse(mySongs.get(position).toString());
            mediaPlayer = MediaPlayer.create(getApplicationContext(), 
            uri);
            sName = mySongs.get(position).toString();
            txtsn.setText(sName);
            mediaPlayer.start();
            play.setBackgroundResource(R.drawable.ic_pause);
            seekBar.setMax(mediaPlayer.getDuration());
            startAnimation(imageView);

                int audiosessionId = mediaPlayer.getAudioSessionId();
                if(audiosessionId!= -1){
                      visualizer.setAudioSessionId(audiosessionId);
                        }
                     }
              });

              fastforward.setOnClickListener(new View.OnClickListener() 
        {
              @Override
             public void onClick(View v) {
                 if (mediaPlayer.isPlaying()){
                
          mediaPlayer.seekTo(mediaPlayer.getCurrentPosition()+1000);
                     }
                  }
              });
           fastrewind.setOnClickListener(new View.OnClickListener() {
              @Override
                public void onClick(View v) {
                 if (mediaPlayer.isPlaying()){
                
           mediaPlayer.seekTo(mediaPlayer.getCurrentPosition()-1000);
            }
               }
                   });

          }

                 private boolean isPermissionGranted(){
                  if (Build.VERSION.SDK_INT == Build.VERSION_CODES.R){
                  return Environment.isExternalStorageManager();
               }
               else {
               int readExternalStoragePermission = 
              ContextCompat.checkSelfPermission(this, 
               Manifest.permission.READ_EXTERNAL_STORAGE);
                return readExternalStoragePermission == 
            PackageManager.PERMISSION_GRANTED;
                    }
                     }



         public void startAnimation(View view){
              ObjectAnimator animator = 
       ObjectAnimator.ofFloat(imageView,"rotation",0f,360f);
            animator.setDuration(1000);
             AnimatorSet animatorSet = new AnimatorSet();
             animatorSet.playTogether(animator);
           animatorSet.start();
             }

            public String createTime(int duration) {
             String time = "";
                int min = duration/1000/60;
               int sec = duration/1000%60;
                 time+=min+":";

           if (sec<10) {
             time+="0";
         }
       time+=sec;
       return time;


       }


  }

标签: javaandroid

解决方案


推荐阅读