servis ile findViewById kulanmak istiyorum ama hata veriyor
26.01.2020 - 12:42
View nesneleri static yaparsanız bellek sorunlarına yol açabilirsiniz. Zaten yaptığınız gibi sizi Android Studio uyaracaktır. Bu işlem için öncelikle ön plan servisi yaılması gerekiyor.
public class RadioService extends Service implements MediaPlayer.OnCompletionListener {
public final String CHANNEL_ID = "RadioServiceChannel";
private Context context;
private MediaPlayer mediaPlayer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
}
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
CHANNEL_ID,
Utility.getInstance(context).getString(R.string.cons_notification),
NotificationManager.IMPORTANCE_LOW
);
NotificationManager manager = getSystemService(NotificationManager.class);
assert manager != null;
manager.createNotificationChannel(serviceChannel);
}
}
public void sendNotification(String name, Context context) {
createNotificationChannel();
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,
1, notificationIntent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.main_icon)
.setContentTitle("App name")
.setContentTitle(name + " diyorsunuz.")
.setOngoing(true)
.setAutoCancel(false)
.setSound(null)
//.setStyle(new androidx.media.app.NotificationCompat.MediaStyle())
//.setStyle()
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentIntent(pendingIntent);
Notification notification = builder.build();
startForeground(2, notification);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
context = getApplicationContext();
String url = intent.getStringExtra("url");
String name = intent.getStringExtra("name");
Log.e(CHANNEL_ID, url + " " + name);
sendNotification(name, context);
PlayTask playTask = new PlayTask();
playTask.execute(url);
//initMediaPlayer(url);
return START_STICKY;
}
private class PlayTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... strings) {
mediaPlayer = new MediaPlayer();
try {
if (!strings[0].equals("")) {
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(strings[0]);
mediaPlayer.prepare();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
mediaPlayer.start();
}
}
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
stopSelf();
}
Ardından çalıştırmak ve durdurmak için Activity'nizin içinde bunu kullanmalısınız. ;
private void setPlay() {
Intent radioServiceIntent = new Intent(mContext, RadioService.class);
if (VakitUpdate.getInstance(mContext).RadioServiceIsWork()) {
stopService(radioServiceIntent);
} else {
radioServiceIntent.putExtra("url", radioList.get(position).getUrl());
radioServiceIntent.putExtra("name", radioList.get(position).getName());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mContext.startForegroundService(radioServiceIntent);
} else {
mContext.startService(radioServiceIntent);
}
}
}
Bu servisi kendinize uyarlıyabilirsiniz. Webview 'i
WebView webView = new WebView(context);
şeklinde tanımlayabilirsiniz.
View nesneleri static yaparsanız bellek sorunlarına yol açabilirsiniz. Zaten yaptığınız gibi sizi Android Studio uyaracaktır. Bu işlem için öncelikle ön plan servisi yaılması gerekiyor.
public class RadioService extends Service implements MediaPlayer.OnCompletionListener {
public final String CHANNEL_ID = "RadioServiceChannel";
private Context context;
private MediaPlayer mediaPlayer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
}
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
CHANNEL_ID,
Utility.getInstance(context).getString(R.string.cons_notification),
NotificationManager.IMPORTANCE_LOW
);
NotificationManager manager = getSystemService(NotificationManager.class);
assert manager != null;
manager.createNotificationChannel(serviceChannel);
}
}
public void sendNotification(String name, Context context) {
createNotificationChannel();
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,
1, notificationIntent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.main_icon)
.setContentTitle("App name")
.setContentTitle(name + " diyorsunuz.")
.setOngoing(true)
.setAutoCancel(false)
.setSound(null)
//.setStyle(new androidx.media.app.NotificationCompat.MediaStyle())
//.setStyle()
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentIntent(pendingIntent);
Notification notification = builder.build();
startForeground(2, notification);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
context = getApplicationContext();
String url = intent.getStringExtra("url");
String name = intent.getStringExtra("name");
Log.e(CHANNEL_ID, url + " " + name);
sendNotification(name, context);
PlayTask playTask = new PlayTask();
playTask.execute(url);
//initMediaPlayer(url);
return START_STICKY;
}
private class PlayTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... strings) {
mediaPlayer = new MediaPlayer();
try {
if (!strings[0].equals("")) {
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(strings[0]);
mediaPlayer.prepare();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
mediaPlayer.start();
}
}
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
stopSelf();
}
Ardından çalıştırmak ve durdurmak için Activity'nizin içinde bunu kullanmalısınız. ;
private void setPlay() {
Intent radioServiceIntent = new Intent(mContext, RadioService.class);
if (VakitUpdate.getInstance(mContext).RadioServiceIsWork()) {
stopService(radioServiceIntent);
} else {
radioServiceIntent.putExtra("url", radioList.get(position).getUrl());
radioServiceIntent.putExtra("name", radioList.get(position).getName());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mContext.startForegroundService(radioServiceIntent);
} else {
mContext.startService(radioServiceIntent);
}
}
}
Bu servisi kendinize uyarlıyabilirsiniz. Webview 'i
WebView webView = new WebView(context);
şeklinde tanımlayabilirsiniz.
Bende buna benzer radio servisi yazıcaktım. Eğer yarına kadar bekliyebilirsen kendi yazdıktan sana yardımcı olayım radio yerine sende youtube videosu çalıştırmanın bir yonunu buluruz muhtemelen.
Tekrardan merhaba öncelikle youtube canlı yayın çalıştıracaksanız onu webview üzerinden çalışmaz. onun için google apisini kullanmanız gereklidir. Youtube için Google Cloud Platform üzerinde Youtube Apisi var. Ancak sadece ses alıcaksanız onu MediaPlayer ile yapabilrisiniz. Daha ayrıntılı anlatırsanız size yardımcı olmak isterim.
Merhaba bu sorunuzu r10 'da da görmüştüm. Öncelikle Servislerin ön katmanları yoktur. Yani view nesneleri yoktur. Orada bir görsel tanımlama yapamazsınız. Ancak bildirim çubuklarını tanımlaya bilirsiniz. Asıl amaç nedir Webview ile youtube vidoe su açmak mı ?