• 13-03-2023, 19:45:18
    #1
    Flutter ile bir uygulama geliştiriyorum, yeniyim. Mobilde ses açma/kapama tuşunu override etmek için dinlemeye çalışıyorum.

    Paketlerin hepsinde destek kesilmiş ve eskiler ondan kullanmadım. Zaten çoğu butonu değil ses seviyesini dinliyor. Ses seviyesi değil direkt buton tıklamalari dinlemek istiyorum.

    USB ile fiziksel cihazda çalışıyorum. Simülatör değil, kaldırmıyor bilgisayar.

    Aşağıda açıkladığım yöntemleri denedim. şöyle bir sorun var, eğer bilgisayardan bir tuşa basılmazsa veya telefonda sanal klavye açılmazsa asla dinleme çalışmıyor. Bunları yapınca çalışmaya başlıyor. Ama uygulamayı arkaplana atıp geri getirince de artık çalışmıyor. Bunun odak ile ilgili olduğunu zannediyorum. Ama focus, focusscope widgetleri, focusnode, focusspocenode değişkenlerini her şekilde kullandım yok olmuyor. İlla klavye aktif edilmeden çalışmıyor.

    Klavyeyi açmadan aktif etmeyi de beceremedim. En azından böyle bir hile deneyim demiştim.

    Fiziksel cihaz tuşunu klavye olmadan dinleyemiyor muyuz?

    Cihazım Xiaomi ve aslında vscode debug konsolunda (hiç bir şey yapmaya gerek kalmadan) keyeventlerin log'u (miuiinput ismiyle) görünüyor. Bu kodları yazmasam da telefondan ses tuşlarına basınca log geliyor. Yani bunları yakalayıp dinleyebilmem gerekmez mi?

    Yerel kod için Java,kotlin, swift bilmiyorum. Kopyala yapıştır yapsam bile ileride bakımını ve değişiklikleri takip etme zorluğu çıkacak.

    Flutter service kütüphanesinde yani çekirdekte bunu dinleme imkanı vermiş ama sorun yaşıyorum. Hatta bu sorun githubda 3 yıldır defalarca bildirilmiş ama ne çözüm var ne ilerleme..

    Hardwarekeyboard.instance.addhandle denedim, rawkeyboard addlistener denedim, widgetları da denedim. Keyboardlistener, rawkeyboardlistener, shorcuts, focus vs...

    Kaç gündür araştırıyorum bakmadığını arama sonucu kalmadı Googleda, chatgpt de yardımcı olmadı, discord kanalları da, dokümantasyonlarda da bunun için gerekli her şeyi denedim yok çözemedim. Bir şeyi mi kaçıyorum yoksa zaten böyle mi. Öyleyse de bir çözüm önerisi, hile, geçici çözüm filan var mı? Lütfen yardımcı olun kafayı yemek üzereyim artık.
  • 16-03-2023, 01:16:25
    #2
    Bunu yapmak pek mümkün değil gibi ayrıca kullanıcının ses seviyesini kısıtlamak kullanıcı deneyimi açısından da kötü bir hareket olacaktır.
  • 16-03-2023, 01:27:11
    #3
    React native de bazı api ler, build almadan çalışmıyor. Muhtemelen benzer bir durumdan müzdaripsiniz. Native tarafla haberleşemiyor flutter bence. Build alıp kontrol ettiniz mi? Birde permission larda var mı bu bilmiyorum ama buraya da takılıyor olabilir. Flutter bilmiyorum sadece fikir vermek amaçlı aklıma gelenleri söylemek istedim.
  • 16-03-2023, 03:01:46
    #4
    alicemalturan1 adlı üyeden alıntı: mesajı görüntüle
    Bunu yapmak pek mümkün değil gibi ayrıca kullanıcının ses seviyesini kısıtlamak kullanıcı deneyimi açısından da kötü bir hareket olacaktır.
    Mümkün hocam niye mümkün olmasın. Çalışıyor zaten ama odak problemi var. Klavye açılana kadar çalışmıyor. Zaten isteğe bağlı olacak, uygulama ayarlarından açılıp/kapatilabilmesi şeklinde.

    VBuMaSTeR adlı üyeden alıntı: mesajı görüntüle
    React native de bazı api ler, build almadan çalışmıyor. Muhtemelen benzer bir durumdan müzdaripsiniz. Native tarafla haberleşemiyor flutter bence. Build alıp kontrol ettiniz mi? Birde permission larda var mı bu bilmiyorum ama buraya da takılıyor olabilir. Flutter bilmiyorum sadece fikir vermek amaçlı aklıma gelenleri söylemek istedim.
    Valla hocam düşündüm de hiç build alıp denemedim. Hiç çalışmamazlık değil, sadece klavyeye focus'lanmadan çalışmıyor. Debug mod olarak kurulu zaten telefonda ama release ye de bakayım inşallah.

    2018 den beri kapatılmamış onlarca hata raporu buldum github'da.

    Denemediğim yöntem kalmadı. Denemediğim paket de kalmadı. Hatta Java/kotlin bilmesem de uğraşıp platforma özel kod da ekledim. Yok hiç bir şekilde klavye odağı gelmeden çalışmıyor. Bunun flutter çekirdek sorunu olduğunu düşünüyorum ama 5 yıldır da çözmemezlik yapılmaz herhalde.

    Klavye odağından bağımsız olarak her tıklamada MIUIinput tıklandığına dair log gönderiyor. Onu yakalamaya çalıştım ama onu da beceremedim.

    Java/kotlin videolarına da baktım orada 3-4 satırla çalışıyor. Yani android kısıtlaması yok. Flutterda sorun var bence. Tabi bu özelliğe ihtiyacım var, bunaldım. Cevaplar için teşekkürler.
  • 16-03-2023, 10:22:52
    #5
    aslında pub devin yaptıgı eklenti bu iş için perfect_volume_control: ^1.0.5 kontrollu bir sekilde kullanirsan. Flutter Uygulamasında Donanım Ses Düğmesine basıldığını dinleyebilir ve hangi düğmeye basıldığını, Ses Açma veya Ses kısma olarak belirleyebilirsiniz.
    örnek olarak kendi yukarda veridigim linkte Xhambis tarafından örnek bir kodlama gerçekleştirilmiştir

    Öncelikle pubspec.yaml dosyasına aşağıdaki satırları ekleyerek perfect_volume_control Flutter paketini projenize ekleyin:

    dependencies: flutter: sdk: flutter perfect_volume_control: ^1.0.5
    perfect_volume_control paketi, mevcut ses seviyesini almanızı, ses seviyesini ayarlamanızı ve ses değişimini dinlemenizi kolaylaştıracaktır. Yukarı veya aşağı ses düğmesine basmayı algılamak için ses değiştirme dinleyicisini kullanacağız.

    Flutter'da Ses Düğmesine Basıldığında Nasıl Dinlenir?

    import 'package:perfect_volume_control/perfect_volume_control.dart';
    PerfectVolumeControl.stream.listen((volume) { //volume button is pressed, // this listener will be triggeret 3 times at one button press
    });
    Bu dinleyici, sistem sesi, müzik sesi ve alarm sesi için üç kez tetiklenecektir. Ses veya ses kısma düğmesinden hangi düğmeye basıldığını belirlemek için birkaç ince ayar yaptık. Dikkatli olun, kodumuzda, ses seviyesi UI'sinden manuel olarak artırma, ses düğmesine basmak olarak alınacaktır.

    Hangi Ses Yukarı/Aşağı Düğmesine Basıldığı Nasıl Anlaşılır?

    Aşağıdaki Flutter Uygulaması örnek kodunun tamamına bakın, ses seviyesi değiştirildiğinde ses düğmesi algılamasını tespit ettik.

    import 'package:flutter/material.dart';
    import 'package:perfect_volume_control/perfect_volume_control.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget{
      @override
      Widget build(BuildContext context) {
         return MaterialApp(
             home: Home()
          );
      }
    }
    
    class Home extends  StatefulWidget {
      @override
      State<Home> createState() => _HomeState();
    }
    
    class _HomeState extends State<Home> {
    
      double currentvol = 0.5;
      String buttontype = "none";
    
      @override
      void initState() {
        Future.delayed(Duration.zero,() async {
            currentvol = await PerfectVolumeControl.getVolume();
            //get current volume
    
            setState(() {
                //refresh UI
            });
        });
    
        PerfectVolumeControl.stream.listen((volume) {  
          /ses düğmesine basılır  
          // bu dinleyici tek tuşa basıldığında 3 kez tetiklenecek 
            
           if(volume != currentvol){ //düğme tipi kontrolünü yalnızca bir kez yürütün 
               if(volume > currentvol){ //yeni ses daha büyükse, yukarı düğmesi 
                  buttontype = "up";
               }else{ // aşağı düğme
                  buttontype = "down";
               }
           }
    
           setState(() {
              currentvol = volume;
           });
        });
        super.initState();
      }
      
      @override
      Widget build(BuildContext context) {
        return Scaffold(
             appBar: AppBar(
                title: Text("Ses Düğmesine Bas"),
                backgroundColor: Colors.redAccent,
             ),
    
             body: Container(
                    padding: EdgeInsets.all(20),
                    child: Column( 
                      children: [
                         
                         Text("Mevcut Hacim : $currentvol"),
    
                         Divider(),
    
                         buttontype == "none"?
                              Text("Henüz hiçbir düğmeye basılmadı ."):
                              Text(buttontype == "up"? "Ses Açma Düğmesine Basıldığında ":
                                    "Ses Kısma Düğmesine Basıldığında ", 
                                        style: TextStyle(fontSize: 20),)
                              
                      ],
                    ) 
                )   
              
        );
      } 
    }
    Sesi Aç düğmesine Basıldığında.


    Ses Kısma düğmesine basıldığında.



    Bu şekilde, Flutter Uygulamasında Donanım Ses Düğmesine basıldığını dinleyebilir ve hangi düğmeye basıldığını, Ses Açma veya Ses kısma olarak belirleyebilirsiniz.
  • 16-03-2023, 14:38:19
    #6
    OmerAti adlı üyeden alıntı: mesajı görüntüle
    aslında pub devin yaptıgı eklenti bu iş için perfect_volume_control: ^1.0.5 kontrollu bir sekilde kullanirsan. Flutter Uygulamasında Donanım Ses Düğmesine basıldığını dinleyebilir ve hangi düğmeye basıldığını, Ses Açma veya Ses kısma olarak belirleyebilirsiniz.
    örnek olarak kendi yukarda veridigim linkte Xhambis tarafından örnek bir kodlama gerçekleştirilmiştir

    Öncelikle pubspec.yaml dosyasına aşağıdaki satırları ekleyerek perfect_volume_control Flutter paketini projenize ekleyin:

    dependencies: flutter: sdk: flutter perfect_volume_control: ^1.0.5
    perfect_volume_control paketi, mevcut ses seviyesini almanızı, ses seviyesini ayarlamanızı ve ses değişimini dinlemenizi kolaylaştıracaktır. Yukarı veya aşağı ses düğmesine basmayı algılamak için ses değiştirme dinleyicisini kullanacağız.

    Flutter'da Ses Düğmesine Basıldığında Nasıl Dinlenir?

    import 'package:perfect_volume_control/perfect_volume_control.dart';
    PerfectVolumeControl.stream.listen((volume) { //volume button is pressed, // this listener will be triggeret 3 times at one button press
    });
    Bu dinleyici, sistem sesi, müzik sesi ve alarm sesi için üç kez tetiklenecektir. Ses veya ses kısma düğmesinden hangi düğmeye basıldığını belirlemek için birkaç ince ayar yaptık. Dikkatli olun, kodumuzda, ses seviyesi UI'sinden manuel olarak artırma, ses düğmesine basmak olarak alınacaktır.

    Hangi Ses Yukarı/Aşağı Düğmesine Basıldığı Nasıl Anlaşılır?

    Aşağıdaki Flutter Uygulaması örnek kodunun tamamına bakın, ses seviyesi değiştirildiğinde ses düğmesi algılamasını tespit ettik.

    import 'package:flutter/material.dart';
    import 'package:perfect_volume_control/perfect_volume_control.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget{
      @override
      Widget build(BuildContext context) {
         return MaterialApp(
             home: Home()
          );
      }
    }
    
    class Home extends  StatefulWidget {
      @override
      State<Home> createState() => _HomeState();
    }
    
    class _HomeState extends State<Home> {
    
      double currentvol = 0.5;
      String buttontype = "none";
    
      @override
      void initState() {
        Future.delayed(Duration.zero,() async {
            currentvol = await PerfectVolumeControl.getVolume();
            //get current volume
    
            setState(() {
                //refresh UI
            });
        });
    
        PerfectVolumeControl.stream.listen((volume) {  
          /ses düğmesine basılır  
          // bu dinleyici tek tuşa basıldığında 3 kez tetiklenecek
            
           if(volume != currentvol){ //düğme tipi kontrolünü yalnızca bir kez yürütün
               if(volume > currentvol){ //yeni ses daha büyükse, yukarı düğmesi
                  buttontype = "up";
               }else{ // aşağı düğme
                  buttontype = "down";
               }
           }
    
           setState(() {
              currentvol = volume;
           });
        });
        super.initState();
      }
      
      @override
      Widget build(BuildContext context) {
        return Scaffold(
             appBar: AppBar(
                title: Text("Ses Düğmesine Bas"),
                backgroundColor: Colors.redAccent,
             ),
    
             body: Container(
                    padding: EdgeInsets.all(20),
                    child: Column(
                      children: [
                        
                         Text("Mevcut Hacim : $currentvol"),
    
                         Divider(),
    
                         buttontype == "none"?
                              Text("Henüz hiçbir düğmeye basılmadı ."):
                              Text(buttontype == "up"? "Ses Açma Düğmesine Basıldığında ":
                                    "Ses Kısma Düğmesine Basıldığında ",
                                        style: TextStyle(fontSize: 20),)
                              
                      ],
                    )
                )  
              
        );
      }
    }
    Sesi Aç düğmesine Basıldığında.


    Ses Kısma düğmesine basıldığında.



    Bu şekilde, Flutter Uygulamasında Donanım Ses Düğmesine basıldığını dinleyebilir ve hangi düğmeye basıldığını, Ses Açma veya Ses kısma olarak belirleyebilirsiniz.
    Bu da denediğim paketlerden biriydi hocam ama dikkat edin bu ses seviyesini dinliyor/takip ediyor, ses tuşlarını değil. Arada büyük bir uçurum var.

    Ses tuşlarını da buradan tespit edebiliriz tabi ama aynı şey değil. Bu paketle Ui dan ses değiştirilince de tetiklenir. Ses tuşuna basılı tutunca da tetiklenir. Sesi değiştiren herhangi bir eylem bunu tetikler. Basılı tutumalar ve down/up gibi buton tıklama türleri birbirinden ayrılamaz. Çünkü butonla alakası yok, sesi dinliyor.

    Yani daha önce denediğim bir paket ve aradığım şeyle pek alakası yok hocam maalesef.