ممنون از اطلاع رسانی، هنوز جا برای تمیز تر شدن داره، شما باید هر کار رو، به صورت جداگانه توی یک تابع بنویسید، اینجوری که همه چیز رو زیر هم مینویسید هم خودتون، هم برنامه نویسای دیگه اگر بعدا بخوان سورس رو تغییر بدن به مشکل بر میخورن، قابل ذکر هست که پروژه های اندروید نیازمند آپدیت هستن و همیشه مجبوریم نسخه های جدید بسازیم.
بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ
دانلود و اجرای موزیک در ویو پیجر
مدیریت گفتگو
آخرین تغییر: 11 سال پیش
یک ویوپیجر دارم که درون هر صفحه مشخصات موزیک هست و پایین صفحه دکمه دانلود، پلی ، پاوز و سیک بار هست .بعد از کلیک روی دکمه دانلود موزیک مورد نظر از سرور دانلود میشه ولی دکمه پلی و پاوز و .... کار نمیکنن. از hashmap هم استفاده کردم .
بعد از اینکه به صفحه بعد میرم و برمیگردم تمام دکمه ها کار میکنن .برای این کار باید تمام لیسنر دکمه ها رو در downloadmanager هم کپی کنم؟
این downloadmanager
public static void initialize() {
downloadCompleteListener = new OnDownloadCompleteListener() {
@Override
public void onDownloadComplete(String url, String localPath) {
Log.i("LOG", "Image Download Complete, Original URL: " + url + ", Save Path: " + localPath);
String newPath = localPath.replace("/temp/", "/final/");
copyFile(localPath, newPath);
new File(localPath).delete();
filename = ActivityStartup.mAudio[pos];
final Set<String> medias = ViewPagerAdapter.audioMap.keySet();
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + filename));
if (mp != null) {
for (String media: medias) {
if (ViewPagerAdapter.audioMap.get(media).equals(filename)) {
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + filename));
mp.start();
}
}
}
}
};
};
public static void addToDownloadList(String url, String filename2) {
String filename = ActivityStartup.filename;
ViewPagerAdapter.audioMap.put(filename2, filename);
if (urls.contains(url)) {
return;
}
if (new File(G.DIR_FINAL + "/" + filename).exists()) {
return;
}
urls.add(url);
DownloadRequest downloadRequest = new DownloadRequest()
.downloadPath("http://192.168.56.1/sharh/" + url)
.filepath(G.DIR_TEMP + "/" + filename)
.listener(downloadCompleteListener)
.download();
}
پاسخها 2
طبق راهنمایی آقای حاج حسینی کد رو به این صورت تغییر دادم و کار کرد.
public void play(View view) {
position = myPager.getCurrentItem();
if (new File(G.DIR_FINAL + "/" + mAudio[position]).exists()) {
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + mAudio[position]));
Toast.makeText(G.context, R.string.playing, Toast.LENGTH_LONG).show();
if (mp != null && !mp.isPlaying()) {
mp.start();
finalTime = mp.getDuration();
startTime = mp.getCurrentPosition();
if (oneTimeOnly == 0) {
seekbar.setMax((int) finalTime);
oneTimeOnly = 1;
}
endTimeField.setText(String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toSeconds((long) finalTime) / 60,
TimeUnit.MILLISECONDS.toSeconds((long) finalTime) % 60)
);
startTimeField.setText(String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toSeconds((long) startTime) / 60,
TimeUnit.MILLISECONDS.toSeconds((long) startTime) % 60)
);
seekbar.setProgress((int) startTime);
myHandler.postDelayed(UpdateSongTime, 100);
pauseButton.setEnabled(true);
playButton.setEnabled(false);
}
}
else {
filename = mAudio[myPager.getCurrentItem()];
d = new AlertDialog.Builder(this)
.setTitle(R.string.download)
.setMessage(R.string.message)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(G.context, R.string.downloading, Toast.LENGTH_LONG).show();
rlPrg.setVisibility(View.VISIBLE);
playButton.setEnabled(false);
seekbar.setVisibility(View.GONE);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
startDownload("http://آدرس پوشه حاوی موزیک ها " + filename, G.DIR_FINAL +
"/" + filename, prgDownloadProgress, txtPercent);
}
});
thread.start();
}
})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.setIcon(R.drawable.download)
.show();
Resources res = G.context.getResources();
TextView messageView = (TextView) ((Dialog) d).findViewById(android.R.id.message);
messageView.setTextColor(res.getColor(R.color.white));
final int titleId = res.getIdentifier("alertTitle", "id", "android");
final View title = ((Dialog) d).findViewById(titleId);
if (title != null) {
((TextView) title).setTextColor(res.getColor(R.color.white));
}
final int titleDividerId = res.getIdentifier("titleDivider", "id", "android");
final View titleDivider = ((Dialog) d).findViewById(titleDividerId);
if (titleDivider != null) {
titleDivider.setBackgroundColor(res.getColor(R.color.white));
}
}
}
این هم دستور دانلود که از راهنمایی دوستمون ahmadvb توی این لینک بود استفاده کردم
private void startDownload(final String downloadURL, final String filePath
, final ProgressBar prgDownloadProgress
, final TextView txtPercent) {
ModuleDownloader downloadRequest = new ModuleDownloader();
OnProgressDownloadListener progressListener = new OnProgressDownloadListener() {
@Override
public void onProgressDownload(final int percent, final int downloadedSize, final int fileSize) {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
Drawable draw = getResources().getDrawable(R.drawable.costum_progress);
prgDownloadProgress.setProgressDrawable(draw);
prgDownloadProgress.setProgress(percent);
txtPercent.setText(percent + " % ");
}
});
}
};
OnDownloadCompleteListener completeListener = new OnDownloadCompleteListener() {
@Override
public void OnDownloadComplete(final String filepath) {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
rlPrg.setVisibility(View.GONE);
pauseButton.setEnabled(false);
playButton.setEnabled(true);
seekbar.setVisibility(View.VISIBLE);
play(playButton);//اینجا بعد از اینکه دانلود تمام شد موزیک پخش میشه
}
});
}
};
downloadRequest.downloadPath(downloadURL)
.filepath(filePath)
.simulate(true)
.progressListener(progressListener)
.completeListener(completeListener);
downloadRequest.download();
}
نظرات
Hajhosseini میشه ی لطفی کنید و کد تمیز شده ی این post رو بزارید
مسعود جان من این کد رو ننوشتم و تمام کلاس هاشو ندارم که تمیزش کنم، خانم دهقان اگر لطف کنن و کد کامل و یا سمپل قرار بدن خیلی بهتره.
فرمایش آقای حاج حسینی کاملا درسته .من خیلی نامرتب نوشتم. باید ببخشید. حالا تا یاد بگیرم کلی راه مونده. در مورد کد ، من یک کم پیچیده و درهم کار کردم کل کدو بذارم آبروم میره D: پایین کد رو میگذارم
با تشکر از زحمات آقای حاج حسینی این لینک نمونه کد هست.
package com.allbaloo.app.Music;
import java.io.File;
import java.util.concurrent.TimeUnit;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
public class ActivityPager extends FragmentActivity {
public TextView startTimeField, endTimeField;
private MediaPlayer mp;
private double startTime = 0;
private double finalTime = 0;
private Handler myHandler = new Handler();
private int forwardTime = 20000;
private int backwardTime = 20000;
private SeekBar seekbar;
public ImageButton playButton;
private ImageButton pauseButton;
public static int oneTimeOnly = 0;
public String content;
Button btnPrev, btnNext;
public static ViewPager myPager;
int position;
static String filename;
ImageView btndwnload;
private int previousState, currentState;
private ProgressBar prgDownloadProgress;
private TextView txtPercent;
private RelativeLayout rlPrg;
private Object d;
private int pos;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.firstplay);
final Animation anim1 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.enter_from_right);
final Animation anim2 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.enter_from_left);
prgDownloadProgress = (ProgressBar) findViewById(R.id.prgDownloadProgress);
txtPercent = (TextView) findViewById(R.id.txtPercent);
rlPrg = (RelativeLayout) findViewById(R.id.rlPrg);
startTimeField = (TextView) findViewById(R.id.textView1);
endTimeField = (TextView) findViewById(R.id.textView2);
seekbar = (SeekBar) findViewById(R.id.seekBar1);
playButton = (ImageButton) findViewById(R.id.imageButton1);
pauseButton = (ImageButton) findViewById(R.id.imageButton2);
btnPrev = (Button) findViewById(R.id.btnPrev);
btnNext = (Button) findViewById(R.id.btnNext);
seekbar.setClickable(false);
pauseButton.setEnabled(false);
Intent i = getIntent();
position = i.getExtras().getInt("page");
filename = mAudio[position];
if (position == 0) {
btnPrev.setVisibility(View.INVISIBLE);
}
else
btnPrev.setVisibility(View.VISIBLE);
if (new File(G.DIR_FINAL + "/" + mAudio[position]).exists()) {
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + mAudio[position]));
}
myPager = (ViewPager) findViewById(R.id.mypager);
MyPagerAdapter adapter = new MyPagerAdapter(this, getSupportFragmentManager());
myPager.setAdapter(adapter);
myPager.setCurrentItem(position);
myPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int pos) {
if (pos == 0) {
btnPrev.setVisibility(View.INVISIBLE);
}
else {
btnPrev.setVisibility(View.VISIBLE);
}
if (mp != null && mp.isPlaying()) {
mp.stop();
playButton.setEnabled(true);
}
if (new File(G.DIR_FINAL + "/" + mAudio[pos]).exists()) {
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + mAudio[pos]));
play(playButton);
}
oneTimeOnly = 0;
seekbar.setProgress(0);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {}
@Override
public void onPageScrollStateChanged(int state) {}
});
}
public void play(View view) {
position = myPager.getCurrentItem();
if (new File(G.DIR_FINAL + "/" + mAudio[position]).exists()) {
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + mAudio[position]));
Toast.makeText(G.context, R.string.playing, Toast.LENGTH_LONG).show();
if (mp != null && !mp.isPlaying()) {
mp.start();
finalTime = mp.getDuration();
startTime = mp.getCurrentPosition();
if (oneTimeOnly == 0) {
seekbar.setMax((int) finalTime);
oneTimeOnly = 1;
}
endTimeField.setText(String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toSeconds((long) finalTime) / 60,
TimeUnit.MILLISECONDS.toSeconds((long) finalTime) % 60)
);
startTimeField.setText(String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toSeconds((long) startTime) / 60,
TimeUnit.MILLISECONDS.toSeconds((long) startTime) % 60)
);
seekbar.setProgress((int) startTime);
myHandler.postDelayed(UpdateSongTime, 100);
pauseButton.setEnabled(true);
playButton.setEnabled(false);
}
}
else {
filename = mAudio[myPager.getCurrentItem()];
d = new AlertDialog.Builder(this)
.setTitle(R.string.download)
.setMessage(R.string.message)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(G.context, R.string.downloading, Toast.LENGTH_LONG).show();
rlPrg.setVisibility(View.VISIBLE);
playButton.setEnabled(false);
seekbar.setVisibility(View.GONE);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
startDownload("http://آدرس پوشه حاوی موزیک ها " + filename, G.DIR_FINAL +
"/" + filename, prgDownloadProgress, txtPercent);
}
});
thread.start();
}
})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.setIcon(R.drawable.download)
.show();
}
}
}
private void startDownload(final String downloadURL, final String filePath
, final ProgressBar prgDownloadProgress
, final TextView txtPercent) {
ModuleDownloader downloadRequest = new ModuleDownloader();
OnProgressDownloadListener progressListener = new OnProgressDownloadListener() {
@Override
public void onProgressDownload(final int percent, final int downloadedSize, final int fileSize) {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
Drawable draw = getResources().getDrawable(R.drawable.costum_progress);
prgDownloadProgress.setProgressDrawable(draw);
prgDownloadProgress.setProgress(percent);
txtPercent.setText(percent + " % ");
}
});
}
};
OnDownloadCompleteListener completeListener = new OnDownloadCompleteListener() {
@Override
public void OnDownloadComplete(final String filepath) {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
rlPrg.setVisibility(View.GONE);
pauseButton.setEnabled(false);
playButton.setEnabled(true);
seekbar.setVisibility(View.VISIBLE);
play(playButton);
}
});
}
};
downloadRequest.downloadPath(downloadURL)
.filepath(filePath)
.simulate(true)
.progressListener(progressListener)
.completeListener(completeListener);
downloadRequest.download();
}
private Runnable UpdateSongTime = new Runnable() {
@Override
public void run() {
if (mp != null && mp.isPlaying()) {
startTime = mp.getCurrentPosition();
startTimeField.setText(String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toSeconds((long) startTime) / 60,
TimeUnit.MILLISECONDS.toSeconds((long) startTime) % 60)
);
seekbar.setProgress((int) startTime);
myHandler.postDelayed(this, 100);
}
}
};
public void pause(View view) {
mp.pause();
pauseButton.setEnabled(false);
playButton.setEnabled(true);
}
public void forward(View view) {
int temp = (int) startTime;
if ((temp + forwardTime) <= finalTime) {
startTime = startTime + forwardTime;
if (mp != null)
mp.seekTo((int) startTime);
}
else {}
}
public void rewind(View view) {
int temp = (int) startTime;
if ((temp - backwardTime) > 0) {
startTime = startTime - backwardTime;
if (mp != null)
mp.seekTo((int) startTime);
}
else {}
}
@Override
protected void onPause() {
super.onPause();
try {
if (mp != null && mp.isPlaying()) {
mp.stop();
mp.release();
myHandler.removeCallbacksAndMessages(null);
}
}
catch (Exception e) {}
}
@Override
protected void onResume() {
super.onResume();
}
@Override
public void onBackPressed()
{
super.onBackPressed();
try {
if (mp != null && mp.isPlaying()) {
mp.stop();
mp.release();
myHandler.removeCallbacksAndMessages(null);
}
}
catch (Exception e) {}
oneTimeOnly = 0;
finish();
}
static String[] mAudio = {
"audio-0.mp3",
"audio-1.mp3",
"audio-2.mp3",
"audio-3.mp3",
"audio-4.mp3",
"audio-5.mp3",
"audio-6.mp3",
"audio-7.mp3",
"audio-8.mp3",
"audio-9.mp3",
"audio-10.mp3",
"audio-11.mp3",
"audio-12.mp3",
"audio-13.mp3",
"audio-14.mp3",
"audio-15.mp3",
"audio-16.mp3",
"audio-17.mp3"
};
private int getItem(int i) {
return myPager.getCurrentItem() + i;
}
}
نظرات
من قبل از این اکتیویتی یک ویوپیجر دارم که position رو از اون ویوپیجر میگیرم. امیدوارم به دردتون بخوره. باز هم به خاطر بی نظمی کد عذر خواهی میکنم. کم کم درست میشه....
لطف کردید، کدهای شما تمیز نوشته شده، ولی شما همه چیز رو توی یک فرگمنت اکتیویتی نوشتید، برای هر کاری باید یک کلاس بنویسید، مثلا توی کد های شما پلی کردن و تمام کارهای که به mediaplayer مربوطه باید توی کلاس MyMediaplayer باشه، یا دانلود باید توی کلاس Downloader باشه، حتی باید برای انیمیشن ها یک کلاس تعریف کنید و تمام انیمیشن های برنامه رو درون اون قرار بدید... این میشه اصولی نوشتن. مهم این نیست که ما الان چقدر تمیز مینویسیم، مهم اینه که چقدر تلاش میکنیم تا ساده، داینامیک و تمیز ترین حالت رو پیاده سازی کنیم.
دوستان منم یه ویو پیجر دارم میخوام یه موزیک ساده تو صفحه قرار بدم هر کاری میکنم اروررر میده موزیک رو هم قسمتrawقرار دادم فرا خوانی که میکنم در قسمت کدها ارورر میده با فرگمنت نوشتم تو رو خدا یه جوابی بدین
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
ویرایش
پیام
نظرات