Soru & Cevap

servis ile findViewById kulanmak istiyorum ama hata veriyor

26.01.2020 - 12:42

merhaba arkadaşlar arka plan da çalışan servisim var bu servis içerisinde webviews çalıtırmak istiyorum fakat 


final WebView url2 = (WebView) findViewById(R.id.we2);
 burada hata alıyorum sebep nedir nasıl düzelte bilirim?

Görsel kaldırıldı.

170 Görüntülenme

6 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-112887-1506457490.jpg
recepözen
28.01.2020 - 06:22

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. 

picture-112887-1506457490.jpg
recepözen
28.01.2020 - 06:22

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. 

picture-112887-1506457490.jpg
recepözen
27.01.2020 - 10:18

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.

picture-112887-1506457490.jpg
recepözen
27.01.2020 - 09:00

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.

ieahmedova
27.01.2020 - 10:07
hocam şöyle anlatayım uygulama açıldığında ekrana başlat durdur diye buton olucak başlata bastığında hem arka plan servisi çalışacak yani homa tuşuna basıp uygulamadan çıktığında uygulamanın çalışmasını istiyorum arkada youtube webviews ile youtube videosunu oynatsın istiyorum zaten webviews açıldığında direk video başlıyor ses olayını zamanla düzeltirim
picture-112887-1506457490.jpg
recepözen
27.01.2020 - 10:41

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ı ? 

ieahmedova
27.01.2020 - 08:34
evet hocam r10 da ben açmıştım konuyu hocam maç yayın uygulaması yapmak istiyorum ve youtube video arka planda gidicek sesli şekilde
picture-115898-1587663423.jpg
busrakbey
26.01.2020 - 07:49

webview'i illa servis içinde tanımlamanıza gerek yok. bide neden final kullandınız ondan da kaynaklanıyor olabilir. 

ieahmedova
27.01.2020 - 08:35
peki arka planda çalışması için ne yapmalıyım örnek bir kodlamanız varmı yapmak istediğim uygulamayı açıp butona tıklandığında arka planda siteye webviews ile girsin uygulamadan çıkıldığında çalışmaya devam etsin ta gi uygulamaya girip durdur a tıklayana kadar