【问题标题】:How to populate listview and play audio file如何填充列表视图并播放音频文件
【发布时间】:2014-03-22 12:27:44
【问题描述】:

我正在尝试从音频文件中填充列表视图并想要播放单击的项目。它不工作。任何帮助。

MainActivity.java

public class MainActivity extends ListActivity {

public static File file; 
private List<String> filelist;
ArrayList<String> MyFiles = new ArrayList<String>();
MediaPlayer mp=new MediaPlayer();

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.list_item);
    final ListView musiclist = (ListView) findViewById(R.id.PhoneMusicList);

    MyFiles = new ArrayList<String>();  


        final String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        file = new File( targetPath + "/AudioRecorder" ) ;
        File list[] = file.listFiles();

        // Binding resources Array to ListAdapter
         for( int i=0; i< list.length; i++)
            {
             MyFiles.add( list[i].getName() );
            }

        ListAdapter adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, MyFiles);

         musiclist.setAdapter(adapter);

musiclist.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
        //checking the position of item in list
        Object listItem =     musiclist.getItemAtPosition(position);
        Toast.makeText(MainActivity.this, ""+ musiclist, Toast.LENGTH_SHORT).show();


                playSong(targetPath + MyFiles.get(position));
    }
});
}

    private void playSong(String songPath) {
        // TODO Auto-generated method stub
         try {
                mp.reset();
                mp.setDataSource(songPath);
                mp.prepare();
                mp.start();

            } catch (IOException e) {
                Log.v(getString(R.string.app_name), e.getMessage());
            }
        }
    }

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical" android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <ListView
        android:id="@+id/PhoneMusicList" 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>

这是我最新的布局文件:

<?xml version="1.0" encoding="utf-8"?>

  <ListView
      android:id="@+id/PhoneMusicList"
      android:layout_width="223dp"
      android:layout_height="334dp" />

  <ImageView
        android:id="@+id/play_pause"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:src="@drawable/pause"/>


I have created an already functioning app which displays ListView items and when an item in the list is selected, it then opens new activity.在 new_activity 中,我有 TextView 和 Image 按钮,显示播放、暂停和停止的音频按钮。 TextView 功能完美,但图像按钮拒绝播放原始文件夹中的音频文件。我在原始文件夹中有许多音频文件,并希望将每个文件分配给将打开每个新活动的每个 ListView。请帮我编辑下面的 ListViewAdapter 代码以播放、暂停和停止播放每个音频文件。

如何编辑此 NewActivity.java 以使用原始文件夹中的歌曲填充它?非常感谢您的支持,谢谢。

public class NewActivity extends AppCompatActivity {
    private String TAG = "NewActivity ----- ; " ;
    // Store instance variables
    private String title;
    private int page;
    MediaPlayer player;

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

        ActionBar actionBar = getSupportActionBar();
        TextView mDetailTv = findViewById(R.id.textView);


        //get data from previous activity when item of activity is clicked using intent
        Intent intent = getIntent();
        String mActionBarTitle = intent.getStringExtra("actionBarTitle");
        String mContent = intent.getStringExtra("contentTv");

        //setctionBar Title
        actionBar.setTitle(mActionBarTitle);
        //get text in text textView
        mDetailTv.setText(mContent);

        //ok we are done,




    public void  play(View v) {
        if (player == null) {
            player = MediaPlayer.create(this, R.raw.song_1);
            Toast.makeText(this, "Tune Playing", Toast.LENGTH_SHORT ).show();
            player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    stopPlayer();
                }
            });
        }
        player.start();
    }
    public void pause(View v) {
        if (player != null) {
            player.pause();
            Toast.makeText(this, "Tune Paused", Toast.LENGTH_SHORT ).show();
        }
    }
    public void stop(View v) {
    stopPlayer();
    }
    private void stopPlayer() {
        if (player != null) {
            player.release();
            player = null;
            Toast.makeText(this, "Tune Stoped", Toast.LENGTH_SHORT ).show();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        stopPlayer();
    }

}

【问题讨论】:

  • 你遇到什么问题,我的意思是你有什么错误吗?
  • 尝试以下解决方案,如果您遇到任何问题,请告诉我
  • 我遇到的问题是应用程序没有打开,它崩溃了

标签: android android-mediaplayer


【解决方案1】:

试试下面的代码。

public class Recording_List extends Activity{

    ListView mListView;
    ImageView mPlayPause;

    private File file;
    private MediaPlayer mp = new MediaPlayer();
    private Handler mHandler = new Handler();
    private List<String> myList = new ArrayList<String>();

    private static final String MEDIA_PATH = new String(
            Environment.getExternalStorageDirectory() + "/AudioRecorder/");

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

        mListView = (ListView) findViewById(R.id.recordList);
        mPlayPause = (ImageView) findViewById(R.id.play_pause);

        file = new File(MEDIA_PATH);
        if (!file.exists()) {
            file.mkdir();
        }
        File list[] = file.listFiles();
        for (int i = 0; i < list.length; i++) {
            myList.add(list[i].getName());
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, myList);
        adapter.notifyDataSetChanged();
        mListView.setAdapter(adapter);
        mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        mListView.setCacheColorHint(Color.TRANSPARENT);

        mListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                playSong(MEDIA_PATH + myList.get(position));
            }
        });

        mPlayPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                if (mp.isPlaying()) {
                    if (mp != null) {
                        mp.pause();
                        mPlayPause.setImageResource(R.drawable.play);
                    }
                } else {
                    if (mp != null) {
                        mp.start();
                        mPlayPause.setImageResource(R.drawable.pause);
                    }
                }
            }
        });
    }

    private void playSong(String songPath) {
        try {
            mp.reset();
            mp.setDataSource(songPath);
            mp.prepare();
            mp.start();
        } catch (IOException e) {
            Log.v(getString(R.string.app_name), e.getMessage());
        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        mp.release();
    }
}

【讨论】:

  • 我只使用一个布局文件和问题中发布的列表视图。我尝试将 Imageview 添加到布局中。我收到错误@custom_list_item、@ R.drawable.play、R.drawable.pause。我在drawable 中添加了两个图标。你能建议需要的布局xml 文件吗?最后一个错误出现在 mhandler ..(mupdateTimetask) 上,mupdateTimetask 无法解析为变量。
  • @Sumit,你不需要使用mupdateTimetask。所以删除它,我已经更新了我的答案,你可以检查一下。而不是使用自定义列表项,您可以使用simple_list_item_1。为此,我也更新了我的答案,所以请检查并告诉我。
  • 同样的错误:“不幸的是您的应用程序已停止”。我再次在我的问题中附加我的布局活动。
  • @innocentkiller:感谢它在我对布局 xml 进行了一些更改后工作,现在我试图弄清楚是否有某种方法可以在列表视图中显示一些自定义文本而不是文件名,将文件保存在后端。建议。
【解决方案2】:

你应该改变 targetPath 如下

targetPath =targetPath + "/AudioRecorder/" ;

或替换

playSong(targetPath + MyFiles.get(position));

playSong(targetPath +"/AudioRecorder/"+ MyFiles.get(position));

【讨论】:

  • 这不起作用。我的意思是应用程序在打开之前就崩溃了。
  • ..@ zohreh 您建议的更改没有任何影响,应用程序仍然崩溃
【解决方案3】:

Ringa_Singa 文件夹中文件的列表视图记录器。 当您停止播放时,您必须返回更新列表,否则没关系。 您可以从该播放按钮播放最新记录

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_record_audio);
    //List View
    final ListView listView = (ListView) findViewById(R.id.listView);
    myList = new ArrayList<String>();
    //Recording events on button
    startbtn = findViewById(R.id.btnRecord);
    stopbtn = findViewById(R.id.btnStop);
    playbtn = findViewById(R.id.btnPlay);
    stopplay = findViewById(R.id.btnStopPlay);
    stopbtn.setEnabled(false);
    playbtn.setEnabled(false);
    stopplay.setEnabled(false);
    mFileName = Environment.getExternalStorageDirectory()+ "/RingaSinga";
    int entryNumber = 1;
    File mFile = new File(mFileName + "/RingaSinga_" + String.valueOf(entryNumber) + ".wav");
    while (mFile.exists()) {
        entryNumber++;
        mFile = new File(mFileName + "/RingaSinga_" + String.valueOf(entryNumber) + ".wav");
    }
    this.mFileName = mFile.getAbsolutePath();
    //List all files on list view
    File directory = Environment.getExternalStorageDirectory();
    mFile = new File( directory + "/RingaSinga" );
    final File list[] = mFile.listFiles();

    for( int i=0; i< list.length; i++)
    {
        myList.add( list[i].getName() );
    }
    final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_item, android.R.id.text1, myList);
    listView.setAdapter(adapter); //Set all the file in the list.
    //Click listner on List item
    final File finalMFile = mFile;
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Toast.makeText(RecordAudio.this, ""+ listView, Toast.LENGTH_SHORT).show();


            playSong(finalMFile + myList.get(position));

        }
    });


    startbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (CheckPermissions()) {
                stopbtn.setEnabled(true);
                startbtn.setEnabled(false);
                playbtn.setEnabled(false);
                stopplay.setEnabled(false);
                mRecorder = new MediaRecorder();
                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mRecorder.setOutputFile(mFileName);
                try {
                    mRecorder.prepare();
                } catch (IOException e) {
                    Log.e(LOG_TAG, "prepare() failed");
                }
                mRecorder.start();
                Toast.makeText(getApplicationContext(), "Recording Started", Toast.LENGTH_LONG).show();
            } else {
                RequestPermissions();
            }
        }
    });
    stopbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            stopbtn.setEnabled(false);
            startbtn.setEnabled(true);
            playbtn.setEnabled(true);
            stopplay.setEnabled(true);
            mRecorder.stop();
            mRecorder.release();
            mRecorder = null;
            Toast.makeText(getApplicationContext(), "Recording Stopped", Toast.LENGTH_LONG).show();
            return;
        }
    });
    playbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            stopbtn.setEnabled(false);
            startbtn.setEnabled(true);
            playbtn.setEnabled(false);
            stopplay.setEnabled(true);
            mPlayer = new MediaPlayer();
            try {
                mPlayer.setDataSource(mFileName);
                mPlayer.prepare();
                mPlayer.start();
                Toast.makeText(getApplicationContext(), "Recording Started Playing", Toast.LENGTH_LONG).show();
            } catch (IOException e) {
                Log.e(LOG_TAG, "prepare() failed");
            }
        }
    });
    stopplay.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mPlayer.release();
            mPlayer = null;
            stopbtn.setEnabled(false);
            startbtn.setEnabled(true);
            playbtn.setEnabled(true);
            stopplay.setEnabled(false);
            Toast.makeText(getApplicationContext(), "Playing Audio Stopped", Toast.LENGTH_SHORT).show();
        }
    });
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_AUDIO_PERMISSION_CODE:
            if (grantResults.length > 0) {
                boolean permissionToRecord = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                boolean permissionToStore = grantResults[1] == PackageManager.PERMISSION_GRANTED;
                boolean permissionToRead = grantResults[2] == PackageManager.PERMISSION_GRANTED;
                if (permissionToRecord && permissionToStore && permissionToRead) {
                    Toast.makeText(getApplicationContext(), "Permission Granted", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(), "Permission Denied", Toast.LENGTH_LONG).show();
                }
            }
            break;
    }
}

public boolean CheckPermissions() {
    int result = ContextCompat.checkSelfPermission(getApplicationContext(), WRITE_EXTERNAL_STORAGE);
    int result1 = ContextCompat.checkSelfPermission(getApplicationContext(), RECORD_AUDIO);
    int result2 = ContextCompat.checkSelfPermission(getApplicationContext(), READ_EXTERNAL_STORAGE);
    return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED && result2 == PackageManager.PERMISSION_GRANTED;

}

private void RequestPermissions() {
    ActivityCompat.requestPermissions(RecordAudio.this, new String[]{RECORD_AUDIO, WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, REQUEST_AUDIO_PERMISSION_CODE);
}
private void playSong(String songPath) {
    try {
        mPlayer = new MediaPlayer();
        mPlayer.reset();
        mPlayer.setDataSource(songPath);
        mPlayer.prepare();
        mPlayer.start();
    } catch (IOException e) {
        Log.v(getString(R.string.app_name), e.getMessage());
    }
}
@Override
protected void onDestroy() {
    super.onDestroy();
    mPlayer.release();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 2011-04-26
    • 2012-03-08
    • 2021-02-18
    • 2011-02-02
    相关资源
    最近更新 更多