`

android mediaPlayer 实例 附源码

阅读更多

/**

菜鸟交流学习所作。实现功能:左右滑动换上、下一曲;上下滑动切换音量;点击、双击播放暂停;随机播放与单曲循环;切换播放路径等。

*/

package com.simplemedia;

import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnTouchListener {
 private String  songRootPath,songpath,rootPath = "/mnt/sdcard/", path, currentRootPath = "/mnt/sdcard/";
 private int currentSong = 0, songCount, id = -1;
 boolean isPaused=false,isStopped=false;
 private ListView showPathList;
 public MediaPlayer mediaPlayer;
 GestureDetector detector;
 public AudioManager audioManager;
 TextView songNamText, stateText, showPathText;
 LinearLayout detectorLayout, layoutParent;
 File currentParent;
 File[] currentFiles;
 ImageButton lastSongBtn, nextSongBtn, voicMaxBtn, voiceDefaultBtn,
   voiceMinBtn, cycleBtn, randomBtn, pathBtn, stopBtn, playBtn,
   pauseBtn;
 private List<String> songList = new ArrayList<String>();
 void init() {
  songNamText = (TextView) findViewById(R.id.songNamText);
  playBtn = (ImageButton) findViewById(R.id.playBtn);
  pauseBtn = (ImageButton) findViewById(R.id.pauseBtn);
  stopBtn = (ImageButton) findViewById(R.id.stopBtn);
  cycleBtn = (ImageButton) findViewById(R.id.cycleBtn);
  randomBtn = (ImageButton) findViewById(R.id.randomBtn);
  pathBtn = (ImageButton) findViewById(R.id.pathBtn);
  lastSongBtn = (ImageButton) findViewById(R.id.lastSongBtn);
  nextSongBtn = (ImageButton) findViewById(R.id.nextSongBtn);
  voicMaxBtn = (ImageButton) findViewById(R.id.voicMaxBtn);
  voiceMinBtn = (ImageButton) findViewById(R.id.voiceMinBtn);
  voiceDefaultBtn = (ImageButton) findViewById(R.id.voiceDefaultBtn);
  detectorLayout = (LinearLayout) findViewById(R.id.detectorLayout);
  layoutParent = (LinearLayout) findViewById(R.id.layoutParent);
  mediaPlayer = new MediaPlayer();
  audioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);
  songList();
  getSongCount();
 }

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  init();
  detector = new GestureDetector(this, new LearnGestureDetector());
  songNamText.setText("当前无播放歌曲");
  detectorLayout.setOnTouchListener(this);
  voicMaxBtn.setOnClickListener(new ImaBtnClickListener());
  voiceMinBtn.setOnClickListener(new ImaBtnClickListener());
  voiceDefaultBtn.setOnClickListener(new ImaBtnClickListener());
  pathBtn.setOnClickListener(new ImaBtnClickListener());
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
   
 class LearnGestureDetector extends GestureDetector.SimpleOnGestureListener {

  @Override
  public boolean onDoubleTap(MotionEvent e) {
   // TODO Auto-generated method stub
   Log.e("---", "onDoubleTap");
   return true;
  }

  @Override
  public boolean onDoubleTapEvent(MotionEvent e) {
   // TODO Auto-generated method stub
   Log.e("onDoubleTap+pause()", "---------");
   pauseMeida();
   return true;
  }

  @Override
  public boolean onDown(MotionEvent e) {
   // TODO Auto-generated method stub
   return true;
  }

  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
    float velocityY) {
   // TODO Auto-generated method stub
   // 向左滑动判断
             Log.e("onFling()", "--------");
   if ((e1.getX() - e2.getX()) > 15
     && ((e1.getX() - e2.getX()) > Math.abs(e1.getY()
       - e2.getY()))) {
    nextSong();
   } else if (e2.getX() - e1.getX() > 15
     && ((e2.getX() - e1.getX()) > Math.abs(e1.getY()
       - e2.getY()))) {
    lastSong();
   } else if ((e1.getY() - e2.getY()) > 15
     && ((e1.getY() - e2.getY()) > Math.abs(e1.getX()
       - e2.getX()))) {
    voiceManagerMax();
   } else if ((e2.getY() - e1.getY()) > 15
     && ((e2.getY() - e1.getY()) > Math.abs(e1.getX()
       - e2.getX()))) {
    voiceManagerMin();
   }

   return true;
  }

  @Override
  public void onLongPress(MotionEvent e) {
   // TODO Auto-generated method stub
   super.onLongPress(e);
  }

  @Override
  public boolean onScroll(MotionEvent e1, MotionEvent e2,
    float distanceX, float distanceY) {
   // TODO Auto-generated method stub
   return true;
  }

  @Override
  public void onShowPress(MotionEvent e) {
   // TODO Auto-generated method stub
   super.onShowPress(e);
  }

  @Override
  public boolean onSingleTapConfirmed(MotionEvent e) {
   // TODO Auto-generated method stub
   Log.e("onSingleTapConfirmed+play()", "---------");
   if(isPaused==false||isStopped==true){
   prepareMedia(MainActivity.this.songpath);
   }
   else{
    playMedia();
   }
   return true;
  }

  @Override
  public boolean onSingleTapUp(MotionEvent e) {
   // TODO Auto-generated method stub
   return true;
  }

 }

 @Override
 public boolean onTouch(View v, MotionEvent event) {
  // TODO Auto-generated method stub
  if (songList.size() > 0) {
   return detector.onTouchEvent(event);
  }
  return false;
 }

 // 选择播放类型
 class SongFilter implements FilenameFilter {

  @Override
  public boolean accept(File arg0, String arg1) {
   // TODO Auto-generated method stub
   if (arg1.endsWith(".wmv")) {
    return true;
   } else if (arg1.endsWith(".mp3")) {
    return true;
   }
   return false;
  }

 }

 // 获得歌曲列表
 public void songList() {

  File rootPath = new File(getPath());
  Log.e("PATH-----", rootPath.getPath());
  // 如果存在.mp3 wmv歌曲
  if (rootPath.listFiles(new SongFilter()).length > 0) {
   for (File file : rootPath.listFiles(new SongFilter())) {
    MainActivity.this.songList.add(file.getName());
   }
   addBtnListener();
  } else {
   Toast.makeText(this, "未找到歌曲", 2000).show();
   removeBtnListener();
  }
 }
    //增加按钮监听
 private void addBtnListener(){
  stopBtn.setOnClickListener(new ImaBtnClickListener());
  cycleBtn.setOnClickListener(new ImaBtnClickListener());
  randomBtn.setOnClickListener(new ImaBtnClickListener());
  playBtn.setOnClickListener(new ImaBtnClickListener());
  pauseBtn.setOnClickListener(new ImaBtnClickListener());
  nextSongBtn.setOnClickListener(new ImaBtnClickListener());
  lastSongBtn.setOnClickListener(new ImaBtnClickListener());
 }
 
 //移除按钮监听
 private void removeBtnListener(){
  stopBtn.setOnClickListener(null);
  cycleBtn.setOnClickListener(null);
  randomBtn.setOnClickListener(null);
  playBtn.setOnClickListener(null);
  pauseBtn.setOnClickListener(null);
  nextSongBtn.setOnClickListener(null);
  lastSongBtn.setOnClickListener(null);
 }
 class ImaBtnClickListener implements OnClickListener {

  @Override
  public void onClick(View v) {
   // TODO Auto-generated method stub
   switch (v.getId()) {
   case R.id.playBtn:
    Log.e("playListener", "--------------");
    // 如果记录存在,则当前歌曲为上一次已完成歌曲的下一首
    if(isPaused==false||isStopped==true){
    prepareMedia(songpath);
    }else{
     playMedia();
    }
    break;
   case R.id.pauseBtn:
    Log.e("pauseListener", "-------");
    pauseMeida();
    break;
   case R.id.nextSongBtn:
    Log.e("nextSongListener", "--------------");
    nextSong();
    break;
   case R.id.lastSongBtn:
    Log.e("lastSongListener", "--------------");
    lastSong();
    break;
   case R.id.voicMaxBtn:
    voiceManagerMax();
    break;
   case R.id.voiceMinBtn:
    voiceManagerMin();
    break;
   case R.id.voiceDefaultBtn:
    voiceManagerDefault();
    break;
   case R.id.stopBtn:
    stopPlayer();
    break;
   case R.id.cycleBtn:
    recyleCurrentSong();
    break;
   case R.id.randomBtn:
    randomPlay();
    break;
   case R.id.pathBtn:
    // getRootPath();
    createDialog();
   }
  }

 }

 // 暂停
 private void pauseMeida() {
  Log.e("In pauseMedia()", "-----");
  isPaused=true;
  if (mediaPlayer.isPlaying()) {
   mediaPlayer.pause();
   songNamText.setText(songList.get(currentSong) + "---暂停中");
  }
 }
 
 //播放器准备
 private void prepareMedia(String songPath){
  Log.e("SONGPATH", songPath);
  isStopped=false;
  if (MainActivity.this.currentSong >= songList.size()) {
   MainActivity.this.currentSong = 0;
  }
  mediaPlayer.reset(); 
   try {
    File songFile=new File(songPath);
    FileInputStream fis=new FileInputStream(songFile);
    mediaPlayer.setDataSource(fis.getFD());
    mediaPlayer.prepare();
   }catch(Exception e){
    e.printStackTrace();
   }
   playMedia();
 }

 // 播放
 private void playMedia() {
  if (!mediaPlayer.isPlaying()) {
   if (MainActivity.this.currentSong >=songList.size()) {
    MainActivity.this.currentSong = 0;
   }
     
    mediaPlayer.start();
    isPaused=false;
    Log.e("In playMedia()", "-----");
    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

     @Override
     public void onCompletion(MediaPlayer mp) {
      // TODO Auto-generated method stub
      if (MainActivity.this.id == 1) {// 单曲循环
       prepareMedia(MainActivity.this.songpath);
       strogeMusicSP(currentSong);
      } else if (MainActivity.this.id == -1) {// 顺序播放(默认模式)
       nextSong();
       strogeMusicSP(currentSong);
      } else if (MainActivity.this.id == 0) {// 随机播放
       currentSong = (int) (songList.size() * Math
         .random()) + 1;
       MainActivity.this.songpath = songRootPath
         +"/"+ songList.get(currentSong);
       prepareMedia(MainActivity.this.songpath);
       strogeMusicSP(currentSong);
      }
     }
    });
    if(mediaPlayer.isPlaying()){
     Log.e("IsPlaying()", "-----------");
    }
   if (MainActivity.this.id == 1) {
    songNamText.setText(songList.get(currentSong)
      + "---播放中--单曲循环模式");
   } else if (MainActivity.this.id == 0) {
    songNamText.setText(songList.get(currentSong)
      + "---播放中--随机播放模式");
   } else {
    songNamText.setText(songList.get(currentSong) + "---播放中--顺序播放模式");
   }
  }
 }

 // 下一首
 private void nextSong() {
  Log.e("In nextSong()", "------");
  if (MainActivity.this.currentSong >= (songList.size() - 1)) {
   MainActivity.this.currentSong = 0;
  } else {
   MainActivity.this.currentSong++;
  }
  MainActivity.this.songpath = songRootPath + "/"+songList.get(currentSong);
  if (mediaPlayer.isPlaying()) {
   prepareMedia(MainActivity.this.songpath);
  }else if(isStopped==true){
   songNamText.setText(songList.get(currentSong) + "---停止中");
  }else{
   songNamText.setText(songList.get(currentSong) + "---暂停中");
  }
 }

 // 停止
 private void stopPlayer() {
  mediaPlayer.stop();
  isStopped=true;
  songNamText.setText(songList.get(currentSong) + "---停止中");
 }

 // 上一首
 private void lastSong() {
  Log.e("In LastSong()", "------");
  if ((MainActivity.this.currentSong - 1) < 0) {
   MainActivity.this.currentSong = songList.size() - 1;
  } else {
   MainActivity.this.currentSong--;
  }
  MainActivity.this.songpath = songRootPath + "/"+songList.get(currentSong);
  if (mediaPlayer.isPlaying()) {
   
   prepareMedia(MainActivity.this.songpath);
  } else if(isStopped==true){
   songNamText.setText(songList.get(currentSong) + "---停止中");
  }else{
   songNamText.setText(songList.get(currentSong) + "---暂停中");
  }
 }

 // 一次单曲循环,一次单击取消转顺序
 private void recyleCurrentSong() {
  Log.e("In recyleCurrentSong()", "------");
  if (MainActivity.this.id != 1) {
   MainActivity.this.id = 1;
   MainActivity.this.songpath = songRootPath
     + "/"+songList.get(currentSong);
   songNamText.setText(songList.get(currentSong) + "---播放中--单曲循环模式");
  } else {
   MainActivity.this.id = -1;
   getSongCount();
   songNamText.setText(songList.get(currentSong) + "---播放中");
  }
 }

 // 一次随机播放,一次单击取消转顺序
 private void randomPlay() {
  Log.e("In randomPlay()", "------");
  if (MainActivity.this.id != 0) {
   MainActivity.this.id = 0;
   songNamText.setText(songList.get(currentSong) + "---播放中--随机播放模式");
  } else {
   MainActivity.this.id = -1;
   getSongCount();
   songNamText.setText(songList.get(currentSong) + "---播放中");
  }
 }

 // 降低音量
 private void voiceManagerMin() {
  MainActivity.this.audioManager.adjustStreamVolume(
    AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER,
    AudioManager.FLAG_SHOW_UI);
 }

 // 提高音量
 private void voiceManagerMax() {
  MainActivity.this.audioManager.adjustStreamVolume(
    AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE,
    AudioManager.FLAG_SHOW_UI);
 }

 // 静音
 private void voiceManagerDefault() {
  MainActivity.this.audioManager.setStreamVolume(
    AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_SHOW_UI);
 }

 // 存储播放器歌曲记录
 private void strogeMusicSP(int currentSong) {
  Context ctx = MainActivity.this;
  SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
  Editor editor = sp.edit();
  editor.putInt("SimpleMedia_int_currentSong", currentSong);
  editor.commit();
 }

 // 存储播放器路径记录
 private void strogePathSP(String songRootPath) {
  Context ctx = MainActivity.this;
  SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
  Editor editor = sp.edit();
  editor.putString("SimpleMedia_string_currentPath", songRootPath);
  editor.commit();
 }

 // 获取播放器记录中上次歌曲位置
 private void getSongCount() {
  Context ctx = MainActivity.this;
  SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
  songCount = sp.getInt("SimpleMedia_int_currentSong", -1);
  if (songCount != -1) {
   MainActivity.this.currentSong = songCount;
  }
  if ((songList.size() > 0) ) {
   // 获取播放歌曲的路径
   if(MainActivity.this.currentSong>=songList.size()){
    MainActivity.this.currentSong=0;
   }
   MainActivity.this.songpath = MainActivity.this.songRootPath +"/"+songList.get(currentSong);
  }
 }

 // 获取播放器记录中上次播放的路径
 private String getPath() {
  Context ctx = MainActivity.this;
  SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
  path = sp.getString("SimpleMedia_string_currentPath", null);
  if (path != null) {
   Log.e("in getPath()",path);
   MainActivity.this.songRootPath = path;
   return MainActivity.this.songRootPath;
  } else {
   MainActivity.this.songRootPath="/mnt/sdcard/";
   return songRootPath;
  }
 }

 // 播放器路径选择
 private void getRootPath() {
  Log.e("LISTVIEW", "----");
  File root = new File(rootPath);
  if (root.exists()) {
   currentParent = root;
   currentFiles = root.listFiles();// 获取根目录下所有文件
   createListView(currentFiles);
  }
  showPathList.setOnItemClickListener(new OnItemClickListener() {

   @Override
   public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
     long arg3) {
    // TODO Auto-generated method stub
    if (arg2 == 0) {
     try {
      if (currentParent.getParentFile().getPath().equals(
        "/mnt")){
       
      }else {
       currentParent = currentParent.getParentFile();
       currentFiles = currentParent.listFiles();
       MainActivity.this.currentRootPath = currentFiles[arg2].getParentFile().getPath();
       createListView(currentFiles);
      }
     } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    } else {
     File[] childFiles = currentFiles[arg2 - 1].listFiles();
     MainActivity.this.currentRootPath = currentFiles[arg2 - 1].getPath();
     if (childFiles != null && childFiles.length > 0) {
      currentParent = currentFiles[arg2 - 1];
      currentFiles = childFiles;
      MainActivity.this.createListView(currentFiles);
     } else {
      Toast.makeText(getApplicationContext(), "文件为空或不可访问",
        2000);
     }
    }
   }
  });

 }

 // listview显示目录
 private void createListView(File[] currentFiles) {
  List<String> fileNameList = new ArrayList<String>();
  showPathText.setText(currentRootPath);
  fileNameList.add("返回上一级");
  for (int i = 0; i < currentFiles.length; i++) {
   fileNameList.add(currentFiles[i].getName());
  }
  showPathList.setAdapter(new ArrayAdapter<String>(MainActivity.this,
    android.R.layout.simple_expandable_list_item_1, fileNameList));
  //setContentView(showPathList);
 }
  //创建dialog
 private void createDialog() {
  Builder builder=new AlertDialog.Builder(this);
  LinearLayout pathLayout=(LinearLayout) getLayoutInflater().inflate(R.layout.path_select, null);
  showPathList = (ListView) pathLayout.findViewById(R.id.showPathList);
  showPathText = (TextView) pathLayout.findViewById(R.id.showPathText);
  getRootPath();//获取路径
  
  builder.setView(pathLayout);
  builder.setPositiveButton("确认路径",
    new DialogInterface.OnClickListener() {

     @Override
     public void onClick(DialogInterface dialog, int which) {
      // TODO Auto-generated method stub
      Log.e("CurrentRootPath", MainActivity.this.currentRootPath);
      strogePathSP(MainActivity.this.currentRootPath);
      songList();
      Log.e("CreateDialog-songList()", "---------------");
      getSongCount();
     }
    });
  builder.setNegativeButton("取消选择",
    new DialogInterface.OnClickListener() {
   
     @Override
     public void onClick(DialogInterface dialog, int which) {
      // TODO Auto-generated method stub
      currentRootPath="/mnt/sdcard/";
     }
    });
        builder.create().show();
 }
  //长按返回键退出
 @Override
 public boolean onKeyLongPress(int keyCode, KeyEvent event) {
  // TODO Auto-generated method stub
  if(keyCode==KeyEvent.KEYCODE_BACK){
   System.exit(0);
  }
  return super.onKeyLongPress(keyCode, event);
 }

   
     
}

分享到:
评论

相关推荐

    android mediaPlayer 实例 附

    本实例将详细讲解如何使用`MediaPlayer`进行媒体播放,并通过附带的`SimpleMedia`代码示例进行深入解析。 1. `MediaPlayer`类概述: `MediaPlayer`是一个强大的类,它支持多种媒体格式,如MP3、AAC、WAV等音频格式...

    android-mediaplayer_android源码_

    在Android源码中,`MediaPlayer`类的实现涉及到多个系统服务,如MediaServer,AudioFlinger等。MediaServer是一个运行在单独进程中的服务,负责处理多媒体数据的解码和硬件交互。AudioFlinger是音频处理的核心服务,...

    Android开发实例大全源码第一部分

    通过研究这些实例源码,开发者可以加深对Android开发的理解,提升解决问题的能力,同时也能学习到最佳实践和优化技巧。这些案例覆盖了Android开发的多个层面,对于初学者和有经验的开发者都是宝贵的参考资料。

    Android开发实例大全源码第二部分

    "Android开发实例大全源码第二部分"提供了一系列的实例源码,涵盖了从实例80以后的项目,这些实例旨在帮助开发者深入理解和掌握Android应用开发的核心技术。以下是这些实例涉及的一些关键知识点: 1. **布局管理**...

    Android 中MediaPlayer使用详解源码

    在使用`MediaPlayer`之前,首先需要实例化一个对象。通常,我们可以通过`MediaPlayer.create()`静态方法来初始化,它会根据传入的上下文和资源ID自动加载媒体文件。例如,播放本地视频可以这样写: ```java ...

    android视频播放器实例源码

    本实例源码是关于如何使用SurfaceView和MediaPlayer类来构建一个非Android自带VideoView的视频播放器。下面将详细探讨这两个关键组件以及它们在视频播放中的作用。 1. **SurfaceView**: SurfaceView是Android提供的...

    Android开发10个实例源码

    "Android开发10个实例源码"集合提供了一系列实用的项目源代码,帮助开发者深入理解Android应用的构建过程,同时也为学习新功能和优化技巧提供了丰富的资源。下面我们将详细探讨这些实例可能涵盖的知识点。 1. **...

    安卓Android源码——(MediaPlayer音乐).rar

    总之,这个`Android源码`包提供了一个实践平台,让你通过实例学习如何在安卓应用中有效地集成和控制音乐播放。深入理解`MediaPlayer`不仅可以提升应用的用户体验,也有助于你更好地处理多媒体相关的复杂场景。通过...

    Android 实例 源码 39个

    在Android开发领域,掌握丰富的实例源码是提升技能的关键步骤之一。"Android 实例 源码 39个"这个资源包包含了39个不同的Android应用实例,旨在帮助开发者深入理解Android应用的工作原理,提高编程技巧。这些实例...

    Android入门书籍实例源码(完整版)花了不少钱的书籍源码就贡献给大家了12.2

    这份名为“Android入门书籍实例源码(完整版)花了不少钱的书籍源码就贡献给大家了12.2”的资源是一份宝贵的Android开发学习材料,包含了一本Android入门书籍中的所有实例源代码。这些源码可以帮助初学者深入理解...

    Android实例源码

    2. **播放器**:在"Android实例源码"中,播放器可能涉及到Android Media Framework,它包含了MediaPlayer类,用于播放音频和视频文件。开发者需要了解如何加载媒体文件,控制播放、暂停、停止,以及调整音量和播放...

    android 实例源码 2

    "Android 实例源码 2"这个资源集合提供了一系列的Android应用示例源代码,旨在帮助开发者深化对Android平台的理解和应用开发技巧。这些源码涵盖了多种功能和场景,对于初学者和有一定经验的开发者来说都是宝贵的参考...

    android经典实例源码

    "Android经典实例源码"集合了多个实际项目中的代码示例,对于初学者来说,这些源码提供了宝贵的实践学习材料。以下将详细介绍这些经典实例可能涉及的Android知识点: 1. **Activity生命周期**:Android应用的核心...

    android编程典型实例与项目开发源码

    《Android编程典型实例与项目开发源码》是吴亚峰编著的一本深入浅出的Android开发教程,书中涵盖了从基础到进阶的各种实例和项目。通过对这些源码的学习,开发者可以快速掌握Android应用程序设计的核心技能。以下是...

    Android应用开发实例源码

    在Android应用开发领域,实例源码是学习和提升技能的重要资源。通过分析和研究实际运行的应用代码,开发者能够深入理解Android系统的运作机制,以及如何利用Java或Kotlin语言构建功能丰富的移动应用程序。以下是对...

    Android上百实例源码集合打包2

    《Android上百实例源码集合打包2》是一份珍贵的学习资源,包含了丰富的Android应用程序开发实例和开源项目的源码解析。这份资料旨在帮助开发者深入理解Android应用的实现机制,提高编程技能,以及掌握最新的开发技巧...

    android 实例源码集合

    在Android开发领域,掌握各种实例源码是提升技能的关键步骤。这个"android 实例源码集合"涵盖了多个重要模块,让我们一一深入探讨这些知识点。 首先,蓝牙(Bluetooth)功能是移动设备间通信的重要方式,特别是在...

    Android播放器 mediaplayer源码下载实例

    摘要:Java源码,Android源码,Android播放器 一款仿写的android手机中的媒体播放器,mediaplayer源码分享与大家下载。源码爱好者以前发过几款android播放器相关源码,有兴趣的搜索一下,这一款里面的注释是英文的,仅...

    Android小游戏连连看源码

    《Android小游戏连连看源码详解》 在移动设备上,小游戏因其轻松有趣、易于上手的特点,深受用户喜爱。作为一款经典的小游戏,连连看在...总的来说,这个源码是Android小游戏开发的绝佳学习实例,值得深入探究。

    Android编程典型实例与项目开发源码

    通过研究《Android编程典型实例与项目开发》源码,你可以深入了解每个知识点的实际应用,从而提高自己的Android开发能力。这些实例和项目覆盖了Android开发的各个方面,从基础到高级,为实际项目开发提供了坚实的...

Global site tag (gtag.js) - Google Analytics