آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

دانلود و اجرای موزیک در ویو پیجر

f-Dehghan  11 سال پیش  11 سال پیش
+2 0

یک ویوپیجر دارم که درون هر صفحه مشخصات موزیک هست و پایین صفحه دکمه دانلود، پلی ، پاوز و سیک بار هست .بعد از کلیک روی دکمه دانلود موزیک مورد نظر از سرور دانلود میشه ولی دکمه پلی و پاوز و .... کار نمیکنن. از 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();
}
+1 0
باید یک لیستنر هم به دانلود منیجرتون ارسال کنید، چون فرگمنت ها ممکنه از 3 تا بیشتر باشه زمانی که دانلود 100% شد و میخواستید لیستنر رو کال کنید، حتما اول چک کنید که null نباشه. ولی لیستنر دکمه ها هیچ ارتباطی به این مساله نداره. دکمه های شما باید وقتی که دانلود تمام شد فعال بشن. (11 سال پیش)
0 0
دانلود که تمام میشه باید یک بار صفحه به صفحه قبل یا بعد اسکرول بشه تا آدرس فایل که داخل sdcard هست رو دریافت کنه. اگر بدون اسکرول کردن پلی رو بزنم فایل رو داخل sdcard نمیبینه. چطوری بدون اسکرول لیست رو آپدیت کنم؟ (11 سال پیش)
0 0
با PagerAdapter صفحه ها رو نوشتم. فرگمنت نیست. (11 سال پیش)
+1 0
خوب شما باید از فرگمنت ها استفاده کنید! بعد اگر لیستنر رو ارسال کنی، میتونی توی همون لیستنر بگی که لیست رو آپدیت کنی. البته شما نباید از روی لیست فایل رو بخونی، باید چک کنی ببینی وجود داره یا نه، اگر نداشت دانلود بشه، اگر درحال دانلوده دیگه دانلود نشه و پیغام در حال دانلود بده. (11 سال پیش)
+1 0
توی پروژه مارکت ، استاد از لیست ویو استفاده کردند و توی دانلودمنیجر بعد از اینکه تصاویر کامل لود شدن دستور ست کردن هر تصویر روی آیتم مربوط به خودش رو دادند. و بدون notifyDataSetChanged لیست آپدیت شد. کاری که من میخوام انجام بدم با این فرق داره؟ من طبق اون پیش رفتم .روشم نادرسته؟ (11 سال پیش)
+1 0
NotifyDataSetChange بسیار سبکه و process خاصی نمیگیره، استاد تغییرات رو برای درک بهتر ما توی adapter هاشون اعمال میکردن ولی این روش توی پروژه های بزرگتر و متوسط درست نیست (در پروژه های کوچک میشه استفاده کرد)، شما باید تغییرات لیست رو توی اکتیویتی انجام بدید، حتی کلیک شدن روی آیتم هارو، ولی کلیک روی دکمه ها و اشیاء توی آیتم های لیست ویو رو باید توی آداپتر بنویسید(مامنند پروژه های استاد). در صورتی که کد ها توی آداپتر باشه، نیازی به NotifyDataSetChange نیست، ولی اگر توی اکتیویتی handle کنید باید حتما Notify کنید تا تغییرات اعمال بشه. (11 سال پیش)
+1 0
به نظر من معماری شما باید اینجوری باشه: زمانی که روی دکمه پخش کلیک میشه، توی آداپتر کلیک نوشته بشه، اگر فایل دانلود شده بود، که پلی بشه، اگر در حال دانلود بود(ینی توی لیست دانلود ها بود) باید اطلاع بده، اگر دانلود نشده بود، به لیست دانلود ها اضافه بشه، ولی تمام این کارها رو باید توی یک کلاس دیگه انجام بدید و نباید همه رو توی آداپتر بنویسید، توی آداپتر مدیاپلیر و نام موزیک رو به کلاس هلپری که میسازید ارسال کنید، اونجا باید عملیات فهمیدن وضعیت انجام بشه، اگر دانلود شده بود باید یک هلپر پخش صدا داشته باشید و آیدی یا آدرس آهنگ رو بفرستید براش که اون همه چیزه پخش رو هندل کنه، اگر هم دانلود نشده بود باید به کلاس دانلودر ارجاء داده بشه، ینی کد هارو تمیز در جای خودشون قرار بدید و همه رو توی آداپتر و اکتیویتی ننویسید (11 سال پیش)
+1 0
ممنون از توجهتون .یعنی اشکال کار من از اینه که دکمه ها رو توی اکتیویتی قرار دادم ؟ باید در آداپتر باشند ؟ (11 سال پیش)
0 0
ممنون .تست میکنم .لطف کردید .خیلی گیج شده بودم. (11 سال پیش)
+1 0
وقتی از ویوپیجر استفاده میکنید که نمیتونید دکمه هاتونو توی اکتیویتی تعریف کنید! یا باید توی Layout ی که به فرگمنت متصل میکنید باشه، یا توی یک Layout که به adapter تون میدید باشه. طریقه استفاده هم بستگی به پیاده سازیتون داره. باز اگر عکس میذاشتید بهتر میتونستم راهنماییتون کنم. (11 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
f-Dehghan  11 سال پیش
+1 0

طبق راهنمایی آقای حاج حسینی کد رو به این صورت تغییر دادم و کار کرد.

     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();
}
+1 0
ممنون از اطلاع رسانی، هنوز جا برای تمیز تر شدن داره، شما باید هر کار رو، به صورت جداگانه توی یک تابع بنویسید، اینجوری که همه چیز رو زیر هم مینویسید هم خودتون، هم برنامه نویسای دیگه اگر بعدا بخوان سورس رو تغییر بدن به مشکل بر میخورن، قابل ذکر هست که پروژه های اندروید نیازمند آپدیت هستن و همیشه مجبوریم نسخه های جدید بسازیم. (11 سال پیش)
0 0
Hajhosseini میشه ی لطفی کنید و کد تمیز شده ی این post رو بزارید (11 سال پیش)
0 0
مسعود جان من این کد رو ننوشتم و تمام کلاس هاشو ندارم که تمیزش کنم، خانم دهقان اگر لطف کنن و کد کامل و یا سمپل قرار بدن خیلی بهتره. (11 سال پیش)
+1 0
فرمایش آقای حاج حسینی کاملا درسته .من خیلی نامرتب نوشتم. باید ببخشید. حالا تا یاد بگیرم کلی راه مونده. در مورد کد ، من یک کم پیچیده و درهم کار کردم کل کدو بذارم آبروم میره D: پایین کد رو میگذارم (11 سال پیش)
+1 0
با تشکر از زحمات آقای حاج حسینی این لینک نمونه کد هست. (11 سال پیش)
پاسخ به سوال 
f-Dehghan  11 سال پیش
+1 0

 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;
}
}

0 0
(11 سال پیش)
0 0
من قبل از این اکتیویتی یک ویوپیجر دارم که position رو از اون ویوپیجر میگیرم. امیدوارم به دردتون بخوره. باز هم به خاطر بی نظمی کد عذر خواهی میکنم. کم کم درست میشه.... (11 سال پیش)
+1 0
لطف کردید، کدهای شما تمیز نوشته شده، ولی شما همه چیز رو توی یک فرگمنت اکتیویتی نوشتید، برای هر کاری باید یک کلاس بنویسید، مثلا توی کد های شما پلی کردن و تمام کارهای که به mediaplayer مربوطه باید توی کلاس MyMediaplayer باشه، یا دانلود باید توی کلاس Downloader باشه، حتی باید برای انیمیشن ها یک کلاس تعریف کنید و تمام انیمیشن های برنامه رو درون اون قرار بدید... این میشه اصولی نوشتن. مهم این نیست که ما الان چقدر تمیز مینویسیم، مهم اینه که چقدر تلاش میکنیم تا ساده، داینامیک و تمیز ترین حالت رو پیاده سازی کنیم. (11 سال پیش)
0 0
دوستان منم یه ویو پیجر دارم میخوام یه موزیک ساده تو صفحه قرار بدم هر کاری میکنم اروررر میده موزیک رو هم قسمتrawقرار دادم فرا خوانی که میکنم در قسمت کدها ارورر میده با فرگمنت نوشتم تو رو خدا یه جوابی بدین (11 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .