Eticaret Mobil Uygulamanıza Sesli Etkileşimler Ekleyin #1

Web

 Günümüzün gelişen teknolojisi ile beraber bir takım farklı stratejiler gerekmektedir. Bir çoğunuzun da bildiği gibi  Bilgisayarlarda, Tabletlerde, Telefonlarda ve diğer Akıllı Cihazlarda artık ses ile yönlendirme ve veya ses ile arama devri başladı.  Eticaret siteleri yöneticilerinin de önemsemesi gereken hususlardan biri de  insanlar artık Arama çubuğunda tuşlara bamak ile uğraşmak yerine;  Voice tuşuna basarak  sesli arama yapmaktalar; Eticaret siteniz veya Eticaret mobil uygulamanız bu  teknolojiye hazır mı ?  (Aşağıda mevcut kod ve formları lütfen profesyonel yazılımcınız ile beraber uygulayın !)

Bu kod etiketinde Sesli Etkileşim API’sı ile uygulamanıza nasıl sesli etkileşimler ekleyeceğinizi öğreneceksiniz. Sesli Etkileşim API’sı, uygulamanızın kullanıcılarının işlemleri onaylamasına ve yalnızca seslerini kullanarak bir seçenekler listesinden seçim yapmasına olanak tanır.

Ne öğreneceksin

  • Sesli işlemleri desteklemek için Android bildirimini güncelleme.
  • Uygulamanızda bir sesli onayın tetiklenmesi.
  • Sesli onaylar için özel takma adlar ekleme.

Gerekenler

Hazır Örnek Kodu İndirin

Tüm örnek kodu bilgisayarınıza indirebilirsiniz …

Zip’i İndir

… veya GitHub deposunu komut satırından klonlayın.

$ git clone https://github.com/googlesamples/io2015-codelabs.git

#2  . Sesli etkileşimi deneyin

Bitmiş örneği deneyerek başlayalım. Bu, ne yaptığımızı göstermemize yardımcı olacak ve size Google uygulaması ile kendi uygulamanız arasındaki etkileşimi gösterecektir.

  1. voice-interaction-end Örnek kod indirmenizden dizini seçin ( Dosya  >   Projeyi İçe Aktar… > voice-interaction-end).
  2. Click Gradle senkronizasyon düğmesine.
  3. Click Çalıştır  butonuna.
  4. Google uygulamasını açın.
  5. “OK Google” deyin.
  6. Sesli komut istemi belirdiğinde, “Bir selfie alın” deyin. Unutmayın: bilinen bir yapılandırma sorunu nedeniyle, çalışmaya başlamadan önce bunu birkaç kez denemeniz gerekebilir.
  7. Ses Kamerası uygulaması açılmalı ve fotoğraf çekmeniz istenmelidir.
  8. “Peynir” e cevap verin.

Bu kadar! Ses Etkileşimi API’sını kullanarak sesle çalışan ilk selfie’nizi aldınız.

Sıkça Sorulan Sorular

#3 Başlangıç ​​uygulamasını oluşturun

Sesli etkileşim

Şimdi başlangıç ​​uygulamasını açalım ve bitmiş örnek uygulamasında gördüğünüz tüm özelliklere sahip olacak şekilde nasıl ses etkileşimi ekleyeceğimizi öğrenelim.

  1. voice-interaction-start Örnek kod indirmenizden dizini seçin ( Dosya  >   Projeyi İçe Aktar… > voice-interaction-start).
  2. Click Gradle senkronizasyon düğmesine.
  3. Click Çalıştır  butonuna.

Birkaç saniye sonra bir kamera uygulaması göreceksiniz. Bizim app şimdiye kadar yaptığı bu kadar. Aşağıdaki adımlarda, bu başlangıç ​​uygulamasına sesli etkileşim ekleyeceğiz.

#4Uygulamayı Android M Önizleme’ye geçirme

Projenizi Sesli Etkileşim API’sına hazırlamak için yapmanız gereken ilk şey, Gradle derleme ayarlarınızı Android M’yi kullanacak şekilde güncellemektir.

Uygulama / build.gradle

compileSdkVersion "android-MNC"
buildToolsVersion "21.1.1"

defaultConfig {
    minSdkVersion "android-MNC"
    targetSdkVersion "android-MNC"
}

Derleme ayarlarınızı değiştirdikten sonra Gradle senkronizasyonu yaptığınızdan emin olun .

Sıkça Sorulan Sorular

#5 Sesli etkileşim amacı ekle

Şimdi uygulamanıza bazı sesli hedefler ekleme zamanı. Biz kullanarak olacak android.media.action.IMAGE_CAPTURE ve android.media.action.STILL_IMAGE_CAMERA zaten Android’de desteklenir sistem eylemleri.

Başvuru / src / main / AndroidManifest.xml’sinde

<activity           
    android:name="com.example.android.voicecamera.TakePictureActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.VOICE" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.media.action.STILL_IMAGE_CAMERA" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.VOICE" />
    </intent-filter>
</activity>

 Sesli Etkileşim API’sı tarafından çağrılması için her iki amaç için android.intent.category.VOICE ve android.intent.category.DEFAULTkategorilerini belirtmemiz gerektiğine dikkat edin .

#6  Sesli Etkileşim amaçlarını ele alma

Uygulamanız için bazı sesli hedefler belirledikten sonra, bunları işlemek için bir etkinlik eklemeniz gerekir.

Pakette çağrılan yeni bir sınıf oluşturun TakePictureActivity ve bu com.example.android.voicecamerapakete aşağıdaki kodu ekleyin.

TakePictureActivity.java

package com.example.android.voicecamera;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class TakePictureActivity extends Activity {
    private static String TAG = "TakePictureActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate: ");
        Intent intent = getIntent();
        if (intent == null) {
            finish();
        } else if (CameraActivity.needPermissions(this)) {
            startActivity(new Intent(this, CameraActivity.class)
                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
            finish();
            return;
        } else if (!isVoiceInteraction()) {
            Log.e(TAG, "Not voice interaction");
            if (intent != null) {
                intent.setComponent(null);
                intent.setPackage("com.google.android.GoogleCamera");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
            finish();
            return;
        }

        setContentView(R.layout.activity_camera);
        CameraFragment fragment = CameraFragment.newInstance();
        fragment.setArguments(getIntent().getExtras());

        getFragmentManager().beginTransaction()
                .replace(R.id.container, fragment)
                .commit();
    }
}

Bu aktivitede, onCreate() yöntemin aktiviteyi tetikleyen amacı incelediğini ve isVoiceInteraction() yardımcı yöntemle bir ses etkileşimi amacı aradığını görebilirsiniz . Ayrıca kamera izinlerinin gerekli olup olmadığını kontrol ettiğini fark edeceksiniz. Bu, Android M’deki uygulamaların çalışma zamanında yeni izinler almasına izin veren başka bir yeni özelliktir.

Tüm kontroller başarılı olursa, etkinlik CameraFragment. Birkaç adımda, o parçaya nasıl ses etkileşimi eklediğimizi göreceksiniz.

#7 Kamera izinlerini alma

Önceki adımda TakePictureActivity kamera izinlerinin nasıl denetlendiğini gördünüz ve bulamazsa kullanıcıyı kullanıcıya yeniden yönlendirdi CameraActivity.

CameraActivity Kullanıcının çalışma zamanında uygulama izinleri vermesine izin vermek için bazı değişiklikler yapmanız gerekir . İlk olarak, dosyaya birkaç içe aktarma ekleyin:

CameraActivity.java

import android.Manifest;
import android.content.pm.PackageManager;
import android.provider.MediaStore;
import android.widget.Toast;

CameraActivity.java

private static final int PERMISSIONS_REQUEST_ALL_PERMISSIONS = 1;
private Bundle mSavedInstanceState;

CameraActivity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();

    if (needPermissions(this)) {
        requestPermissions();
    } else if (intent != null) {
        intent.setComponent(null);
        intent.setPackage("com.google.android.GoogleCamera");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        finish();
    } else {
        finish();
    }
}

CameraActivity.java

static public boolean needPermissions(Activity activity) {
    Log.d(TAG, "needPermissions: ");
    return activity.checkSelfPermission(Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED
            || activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED;
}

CameraActivity.java

private void requestPermissions() {
    Log.d(TAG, "requestPermissions: ");
    String[] permissions = new String[] {
        Manifest.permission.CAMERA,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
    };
    requestPermissions(permissions, PERMISSIONS_REQUEST_ALL_PERMISSIONS);
}

Ne zaman requestPermissions()tamamladığını, bu bir geri arama yapacaktır onRequestPermissionsResult Eğer tüm izinlere verildi olup olmadığını kaydetmek gerekir nerede yöntemi.

CameraActivity.java

public void onRequestPermissionsResult(int requestCode, String permissions[],
                                           int[] grantResults) {
    switch (requestCode) {
        case PERMISSIONS_REQUEST_ALL_PERMISSIONS:
            boolean hasAllPermissions = true;
            for (int i = 0; i < grantResults.length; ++i) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                    hasAllPermissions = false;
                    Log.e(TAG, "Unable to get permission " + permissions[i]);
                }
            }
            if (hasAllPermissions) {
                finish();
            } else {
                Toast.makeText(this,
                        "Unable to get all required permissions", Toast.LENGTH_LONG).show();
                finish();
                return;
            }
            break;
        default:
            Log.e(TAG, "Unexpected request code");
    }
}

Şimdi, uygulamanızın kameraya erişebildiğinden emin oldunuz ve eğer değilse, kullanıcıdan uygulamanıza kamera erişimi vermek isteyip istemediğine karar vermeniz istenir.

#8 Fotoğraf çekmek için “Say peynir” i uygulayın

Şimdi eğlenceli kısma geçelim: uygulamanızla asistan arasındaki sesli etkileşimi tanımlayın. Önce bazı ithalatları ekleyeceğiz.

CameraFragment.java

import android.app.VoiceInteractor;
import android.app.VoiceInteractor.PickOptionRequest;
import android.app.VoiceInteractor.PickOptionRequest.Option;
import android.view.Gravity;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;

Asistan kullanıcının yanıtını yakaladıktan sonra odak uygulamanıza geri döner ve fotoğraf çekmeye devam edebilirsiniz. Bunu yapmak için, onResume() yönteminizin sonuna sesli etkileşimi kontrol eden bir if ifadesi ekleyin . Birini bulursa, bir zamanlayıcının belirtilip belirtilmediğini kontrol eder ve çağırır startVoiceTimer(), aksi takdirde startVoiceTrigger() yöntemi çağırır .

CameraFragment.java

@Override
public void onResume() {
    super.onResume();
    Log.d(TAG, "onResume: ");
    startBackgroundThread();

    // When the screen is turned off and turned back on, the SurfaceTexture is already
    // available, and "onSurfaceTextureAvailable" will not be called. In that case, we can open
    // a camera and start preview from here (otherwise, we wait until the surface is ready in
    // the SurfaceTextureListener).
    if (mTextureView.isAvailable()) {
        openCamera(mTextureView.getWidth(), mTextureView.getHeight());
    } else {
        mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
    }

    if (mOrientationListener.canDetectOrientation()) {
        mOrientationListener.enable();
    }

    if (getActivity().isVoiceInteraction()) {
        if (isTimerSpecified()) {
            startVoiceTimer();
        } else {
            startVoiceTrigger();
        }
    }
}

Şimdi startVoiceTrigger() yöntemi oluşturun  . VoiceInteractor Etkinlikten alarak sesli etkileşim oluşturun . Gördüğünüz gibi Option , kullanıcıya sunulanları kolayca özelleştirebilirsiniz . “Cheese”, “ready”, “go”, “take” ve “ok” kelimesinin eş anlamlılarını ekleyin.

CameraFragment.java

private void startVoiceTrigger() {
    Log.d(TAG, "startVoiceTrigger: ");
    Option option = new Option("cheese");
    option.addSynonym("ready");
    option.addSynonym("go");
    option.addSynonym("take it");
    option.addSynonym("ok");

    getActivity().getVoiceInteractor()
        .submitRequest(new PickOptionRequest("Say Cheese", new Option[]{option}, null) {
            @Override
            public void onPickOptionResult(boolean finished, Option[] selections, Bundle result) {
                if (finished && selections.length == 1) {
                    Message message = Message.obtain();
                    message.obj = result;
                    takePicture();
                } else {
                    getActivity().finish();
                }
            }
            @Override
            public void onCancel() {
                getActivity().finish();
            }
        });
}

Kullanıcı Option bu eş anlamlılardan herhangi birini kullanmayı seçerse , takePicture() yöntem çağrılır; aksi takdirde etkinlikten çıkarız.

#9 Kameraya ses etkileşimi ekleyin

Bir sonraki adım, ses etkileşim yeteneklerini kamera parçanıza eklemektir. İlk olarak, newInstance() bu parçanın yeni örneklerini oluşturmaya yardımcı olacak yöntemi ekleyin .

CameraFragment.java

public static CameraFragment newInstance() {
    Log.d(TAG, "newInstance: ");
    CameraFragment fragment = new CameraFragment();
    fragment.setRetainInstance(true);
    return fragment;
}

In onCreateView() yöntemle, sesli etkileşimleri kontrol etmek ve kullanıcı ses yoluyla etkileşim halinde kamera Kontrolleri gizlemek gerekir.

CameraFragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Log.d(TAG, "onCreateView: ");
    View view = inflater.inflate(R.layout.fragment_camera2_basic, container, false);
    if (getActivity().isVoiceInteraction()) {
        View controls = view.findViewById(R.id.controls);
        if (controls != null) {
            controls.setVisibility(View.GONE);
        }
    }
    return view;
}

Son olarak, showToast() yöntemi yalnızca bir fotoğrafın çekildiğine dair görsel bir onay göstermekle kalmayacak, aynı zamanda “İşte burada” diyerek sesli olarak onaylayacak şekilde yöntemi geliştireceğiz .

CameraFragment.java

private void showToast(String text) {
    // We show a Toast by sending request message to mMessageHandler. This makes sure that the
    // Toast is shown on the UI thread.
    Activity activity = getActivity();
    if (activity.isVoiceInteraction()) {
        Message message = Message.obtain();
        message.obj = text;
        //mSharingHandler.sendMessage(message);

        Uri contextUri = Uri.fromFile(mFile);
        Log.e(TAG, "PHOTO URI: " + contextUri);
        Log.e(TAG, "PHOTO LOCATION: " + mFile.getAbsolutePath());
        Log.e(TAG, "showToast:" + Log.getStackTraceString(new Exception()));

        Bundle extras = new Bundle();
        extras.putParcelable("context_uri", contextUri);
        activity.getVoiceInteractor().submitRequest(
                new VoiceInteractor.CompleteVoiceRequest("Here it is", extras) {
            @Override
            public void onCompleteResult(Bundle result) {
                super.onCompleteResult(result);
                Log.d(TAG, "OnCompleteResult:" + Log.getStackTraceString(new Exception()));
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setDataAndType(Uri.parse("file://" + mFile.getAbsolutePath()), "image/*");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                getActivity().finish();
                startActivity(intent);
            }
        });
   } else {
        Message message = Message.obtain();
        message.obj = text;
        mMessageHandler.sendMessage(message);
    }
}

Artık kamera parçası ses etkileşimlerini işlemeye hazır.

#10  Geri sayım sayacı ekle

Kamera eller serbest modunda fotoğraf çekerken, ne zaman gülümseyeceğinizi bilmeniz için bir sayacınız olması yararlı olur. İlk olarak, birkaç özellik eklemeniz gerekir CameraFragment.

CameraFragment.java

private static final String EXTRA_TIMER_DURATION_SECONDS = "android.intent.extra.TIMER_DURATION_SECONDS";

private TextView mTimerCountdownLabel = null;
private Toast mTimerCountdownToast = null;

Daha sonra, startVoiceTime() tostu oluşturmak ve zamanlayıcıyı başlatmak için yöntemin eklenmesi gerekir.

CameraFragment.java

private void startVoiceTimer() {
    Log.d(TAG, "startVoiceTimer: ");
    final int countdown = getArguments().getInt(EXTRA_TIMER_DURATION_SECONDS);

    mTimerCountdownToast = new Toast(getActivity().getApplicationContext());
    mTimerCountdownToast.setGravity(Gravity.CENTER, 0, 0);
    mTimerCountdownToast.setDuration(Toast.LENGTH_SHORT);

    LayoutInflater inflater = getActivity().getLayoutInflater();
    View layout = inflater.inflate(R.layout.toast_timer,
        (ViewGroup) getActivity().findViewById(R.id.toast_layout_root));
    mTimerCountdownToast.setView(layout);
    final TextView label = (TextView) layout.findViewById(R.id.countdown_text);

    Timer timer = new Timer("camera_timer");
    timer.scheduleAtFixedRate(new TimerTask() {
        private int mCountdown = countdown;

        @Override
        public void run() {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (mCountdown < 0) {
                        Log.e(TAG, "Take photo: " + mCountdown);
                        mTimerCountdownToast.cancel();
                        takePicture();
                    } else {
                        Log.e(TAG, "Execute timer: " + mCountdown);
                        label.setText(String.format("Photo in %d", mCountdown));
                        mTimerCountdownToast.show();
                    }
                }
            });
            mCountdown--;
            if (mCountdown < 0) {
                cancel();
            }
        }
    }, 1000, 1000);
}

Ayrıca bir zamanlayıcının varlığını kontrol etmek için bir yardımcı yöntem oluşturmamız gerekir.

CameraFragment.java

private boolean isTimerSpecified() {
    Log.d(TAG, "isTimerSpecified: ");
    return getArguments() != null && getArguments().containsKey(EXTRA_TIMER_DURATION_SECONDS);
}

Eklemeniz gereken tüm kod bu. Eklemeniz gereken birkaç düzen var ve işiniz bitti!

#11  Kullanıcı arayüzünü güncelleme

Kullanıcı arayüzünde bazı güncellemeler yapmak için weneed. İlk olarak, için bir düzen oluşturalım MainActivity. Bu, TextView giriş mesajını gösteren çok basit bir düzendir .

düzen / activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout style="@style/Widget.SampleMessageTile"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:orientation="vertical">

        <TextView style="@style/Widget.SampleMessage"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/horizontal_page_margin"
            android:layout_marginRight="@dimen/horizontal_page_margin"
            android:layout_marginTop="@dimen/vertical_page_margin"
            android:layout_marginBottom="@dimen/vertical_page_margin"
            android:text="@string/intro_message" />
    </LinearLayout>
</LinearLayout>

Ayrıca, tost için geri sayım zamanımızı gösteren bir düzen oluşturmamız gerekiyor. İşte böyle görünüyor:

düzen / toast_timer.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toast_layout_root"
    android:background="@drawable/bg_toast"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="20dp">
    <TextView
        android:id="@+id/countdown_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>

Ve işte bu, sadece sesimizle fotoğraf çekmeye hazırız!

#12 Ses etkileşimini test et

Sesli etkileşim

Artık ses etkileşiminin düzgün çalıştığından emin olmak için uygulamanızı test ediyorsunuz.

  1. Click Gradle senkronizasyon düğmesine.
  2. Click Çalıştır  butonuna.
  3. Google uygulamasını açın.
  4. “OK Google” deyin.
  5. Sesli komut istemi belirdiğinde, “Bir selfie alın” deyin.
  6. Ses Kamerası uygulaması açılmalı ve fotoğraf çekmeniz istenmelidir.
  7. “Peynir” e cevap verin.

Bu kadar! Sesle Etkileşim API’sını kullanarak ilk sesle çalışan kamera uygulamanızı oluşturdunuz ve oldukça tatlı bir fotoğraf çektiniz

#13  . Tebrikler!

Uygulamanız artık uygulamanızdaki sesli etkileşimi desteklemeye hazır. Gördüğünüz gibi, böyle bir eller serbest arayüzünün uygulamanızın kullanımını daha kolay ve kullanıcılar için daha eğlenceli hale getirebileceği birçok alan var.

Neleri ele aldık

  • Sesli işlemleri desteklemek için Android bildirimi güncellendi.
  • Uygulamanızda bir sesli onay tetikledi.
  • Sesli onaylar için özel takma adlar eklendi.

Sonraki adımlar

  • Kendi uygulamanıza sesli etkileşim ekleyin.
  •  Android’de hangi sesli işlemlerin zaten yerleşik olduğunu görmek için sistem işlemleri listesini okuyun .
  • Özel sesli işlemler oluşturma hakkında bilgi edinin .

Sesli Etkileşim API’sı hakkında daha fazla bilgi edinmek istiyorsanız, lütfen geliştiricinin belgelerine bakın .

Google arama  etiketi altında Stackoverflow’da soru gönderebilir ve yanıt bulabilirsiniz .

Takıldıgınız yerden bizden destek alabilirsiniz.

Bu yazıya oy vermek için tıklayın!
[Genel Toplam: 1 Ortalama: 5]

Comments (07)

  1. omerfaruk
    1 Mart 2020

    peki bize nasıl yapacağımızı lütfen anlatırmısınız android programlamayı anlatın

  2. Ali Çiçek
    10 Nisan 2020

    eticaret site işini gerçekten iyi yapıyorlar

  3. Eric Jones
    16 Nisan 2020

    Will English texts be shared about e-commerce?

  4. Pingback: Tuncay DEMİR
  5. 23 Nisan 2020

    Merhaba Tuncay Bey,
    Evet Çoğu sesli asistan google alt yapısını kullanmakta ve tüm sesli asistanlar cümleyi (ürün adını) doğru telafiz etmeniz sonucunda ürün listesini yayınlamaktadır. Bunu stratejik olarak kullanabilirsiniz. insanlar yakında klaveye kullanmaktan sıkılacak.

  6. Ahmet ÖZTÜRK
    3 Mayıs 2020

    Mail ile talebimizi gönderdik E-ticaret sitemiz için hem apk hem ios uygulamaya ihtiyacımız mevcut ve sizlerle beraber çalışmak istiyoruz lütfen fiyat teklifini iletirmisiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

%d blogcu bunu beğendi: