Unity Android READ_PHONE_STATE İzni Hakkında

Yayınlandı: 28 Şubat 2018 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde
Etiketler:, , , , , ,

Tekrardan merhabalar,

Bu ufak yazımda, Unity 3D ile Android’e oyun geliştirirken yaşayabileceğiniz rahatsız edici bir sorunu nasıl çözeceğinizi paylaşacağım.

Bazen Unity oyunlarınızı Android’e build alırken siz farkında olmadan uygulamaya READ_PHONE_STATE isminde bir izin eklenebiliyor ve bu durumda oyun başlarken kullanıcıya “XYZ uygulamasına telefon aramaları yapma ve çağrıları yönetme izni verilsin mi?” şeklinde bir diyalog gösteriliyor. Tahmin edeceğiniz üzere, daha uygulama açılır açılmaz kullanıcının böyle bir şey görmesi, onun uygulamaya olan güvenini sarsabilir.

Bu sorunun teşhisi ve çözümü için yazının devamını okuyabilirsiniz…

Yardımcı kaynak: https://forum.unity.com/threads/unity-2017-read_phone_state-permission-cant-remove.486732/

Öncelikle siz de bu sorundan muzdarip misiniz onu teşhis edelim. Bunu anlamanın en kolay yolu, Unity’den Android için build aldıktan sonra projenizin olduğu klasördeki Temp\StagingArea\AndroidManifest.xml dosyasını açıp içerisinde şu satır var mı diye bakmak:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

Eğer yoksa bu sıkıntı sizde yok demektir. Bu durumda bu yazının devamını okumanıza gerek yok. Aksi taktirde teşhisimizin ikinci safhasına geçelim!

Bu safhada, bu iznin projenizdeki bir pluginden mi geldiğini bulacağız. Bunun için projenizin Assets\Plugins\Android klasöründeki tüm AndroidManifest.xml dosyalarını tek tek açıp içlerinde yukarıdaki satır var mı diye bakmalısınız. Ayrıca projenizdeki tüm .aar uzantılı dosyaları bulup Winrar veya benzeri bir program ile açıp onların içindeki AndroidManifest.xml’lere de bakmalısınız. Eğer projenizde hiç AndroidManifest yoksa veya o dosyalarda yukarıdaki satır bulunmuyorsa, o zaman sizin projenizde de READ_PHONE_STATE sıkıntısı var demektir. Ama yok eğer bu satır projenizdeki bir AndroidManifest.xml dosyasından geliyorsa, o zaman bu izni o AndroidManifest dosyasını oraya koyan plugin istiyor demektir ve bu durumda, plugin’in yapımcısıyla temasa geçip niye bu izni istediğini sormaktan başka elinizden bir şey gelmez. Aksi halde READ_PHONE_STATE sorununu çözmek için yazımıza devam edelim.

Projemizi teşhis edip READ_PHONE_STATE zımbırtısının çözülmesi gereken bir hastalık olduğuna kanaat getirdiğimize göre, bu hastalıkla nasıl başa çıkabiliriz ona bakalım. Burada 3 aşamalı bir çözüm yöntemi kullanacağız. Yapmanız gereken, bu adımları sırayla takip edip her bir adımdan sonra tekrar Android build alıp sorunun devam edip etmediğini kontrol etmek (yine Temp\StagingArea\AndroidManifest.xml‘in içeriğini kontrol edebilirsiniz). Eğer sorun çözülmüşse sonraki adımları yapmanıza gerek yok demektir.

1- Assets/Plugins/Android klasöründeki AndroidManifest.xml dosyasını açıp en sondaki </manifest> satırından hemen önce şunu ekleyin:

<uses-sdk android:minSdkVersion="5" />

Buradaki 5 değerini, Edit-Project Settings-Player-Other Settings‘teki “Minimum API Level“da yazan sayı ile değiştirin. Eğer AndroidManifest’inizde halihazırda android:minSdkVersion geçiyorsa ve değeri “Minimum API Level”dan küçükse, onun değerini “Minimum API Level”a eşitleseniz de olur. Eğer projenizde hiç AndroidManifest.xml yoksa da, Unity’nizin kurulu olduğu klasördeki Editor\Data\PlaybackEngines\AndroidPlayer\Apk konumunda (veya o civarlarda) yer alan AndroidManifest.xml’i kopyalayıp projenizin Assets\Plugins\Android klasörüne yapıştırın ve onun üzerinde bu güncellemeyi yapın.

2- Android SDK’yı kurduğunuz klasördeki tools klasörünü silin ve onu şu adresteki 25.2.3 sürümü ile değiştirin: https://dl.google.com/android/repository/tools_r25.2.3-windows.zip (Mac ve Linux için olan indirme linkleri için buraya tıklayın)

3- Assets\Plugins\Android klasöründeki AndroidManifest.xml dosyasının sonundaki </manifest> satırından hemen önce şu satırı ekleyin:

<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />

Dosyanın başındaki <manifest blabla > kısmının içine de şunu ekleyin (eğer zaten yoksa):

xmlns:tools="http://schemas.android.com/tools"

Ardından Build Settings’teki Build System‘ı “Gradle (New)” olarak değiştirip öyle build alın.

İşte bu kadar! Umarım yardımcı olmuştur. Bu sıkıntı bende daha önceden iki defa baş göstermişti ve ilk seferinde 1. adımla, ikinci seferinde de 2. adımla sorun çözülmüştü. Şahsen 3. adımı deneme fırsatım olmadı yani.

O halde sonraki derslerde görüşmek üzere!

yorum
  1. ali dedi ki:

    Merhaba.Konuyla alakalı olmayan bi sorum var.Unityde player settingsten publishing settingse girdim keystore oluşturmaya çalıştım

    başta create new kutusunu işaretledim sonra browse diyip kaydettim daha sonra şifreyi girdim ve tekrar girerek onayladım daha sonra key yazısının altında alias ksmından yeni oluştur diyerek gerekli bilgileri girip kaydettim ilk başta belirtlilen lokasyonda key bulunamıyor diye hata verdi bende build aldım ve hata kayboldu

    şimdi yine aynı ekrandayım ve use existing key seçeneğinde kendi keystorem ekli haldeyken alias kısmında kendi alias ımı seçtim be tekrar build aldım ve player settingte hala şifre alias seçtiğim gibi duruyor işlem tamammı key hazırmı

    resim şu

    https://i.hizliresim.com/PlaLn5.png

    işlem tamam mı şimdi?

  2. ali dedi ki:

    Merhabalar google developer hesabı açarken adres istiyor fatura için hesap açıldıktan sonra kargoyla fatura falanmı yolluyorlar eve yoksa sadece kayıtlara geçmesi içinmi

    • ali dedi ki:

      merhaba oyunda pause tuşuna basınca sizin sitenizden aldığım gelişmiş input sistemini kaybetmek istiyorum oyuna dönüncede geri gelsin çünkü oyunu durdurmak için time.timescale değerini sıfır yapıyorum ama tuş hala basılabilir olduğu için arkaplanda axis değerini yükseltiyor ve oyuna dönünce bütün güç birden objeye veriliyor bende simpleinputu kaybetmek için şöyle bişey yaptım

      public void pausebuton() {
      pausmenu.SetActive(true);
      pausbuton.SetActive(false);
      Time.timeScale = 0;
      simpleinput.setactive(false);

      }
      public void pausecık()

      {
      pausmenu.SetActive(false);
      pausbuton.SetActive(true);
      Time.timeScale = 1;
      simpleinput.setactive(true);

      }

      başta pause tuşuna basınca işe yarıyor ama pausecık fonksiyonunu çalıştırınca geri gelmiyor

      ayrıca alttaki pausecık fonksiyonunda time.timescale fonksiyonunu simpleinput.setactive(true) satırından sonra yazarsam oyun hala donuk kalıyor ve time scale’i 1 e eşitlemiyor.

      Consoldan bakınca simple input için değer atanmamış hatası veriyor ama inspectordan bakınca simple input görünüyor atanmış olarak.

      pause yapınca simple inputu yok etmenin bi yolu varmı set active çalışmıyorsa nebiliyeim posizyonunu canvasın dışına felan çıkaramazmıyız.

      • yasirkula dedi ki:

        Belki sahnenizde bu scriptten birden fazla olabilir ve ikinci scriptte simpleinput’un değeri atanmamış olabilir. Bunu kontrol etmek için pausecık() fonksiyonunuzun başına şu kodu ekleyin:

        Debug.Log( simpleinput == null, gameObject );

        Ardından konsoldaki log’a tıklayınca Hierarchy panelinde vurgulanan objeye tıklayıp onun simpleinput’unun değeri atalı mı diye kontrol edin. Orada değeri atalı olduğu halde konsola True yazdırıyorsa bu çok ilginç bir bug gibi duruyor; daha önce hiç başıma gelmemişti 😀

      • ali dedi ki:

        obje atanmış gözüküyor zaten baştada set aktif değerini false yaparken sıkıntı çıkmıyor set aktif değerini true yapınca sıkıntı var elle düzeltince oluyor ama kod yardımıyla olmuyor

        peki set aktif yapmak yerine objeyi kanvas dışına çıkarsak olmazmı amacım zaten tuşa olan erişmi engellemek

      • yasirkula dedi ki:

        Evet SetParent ile objeyi Canvas dışına taşımanız da işe yarar.

      • ali dedi ki:

        teşekkürler

      • ali dedi ki:

        Sorunu çözdüm aynı kod dosyasının içine değilde yeni csharp dosyasına yazınca oldu

    • yasirkula dedi ki:

      Bana fatura geldiğini hatırlamıyorum o yüzden sadece kayıtlara geçmesi için diyeceğim ama %100 kesin bir bilgim yok.

  3. Hüseyin dedi ki:

    Hocam ben bir oyun yapıyorum. Oyundaki 3d modelleri internetten indirdim free olarak.
    Bunları oyunumda kullansam sorun olurmu.
    Birde ben 3ds max ile modelleme yapma ve adobe photoshop konusunda biraz iyiyimdir.
    Bu internetten indirdiğim modellerin üzerinde 3ds max ile biraz değişiklik yapsam ve texturelerini ben kendim yapsam bir sorun olurmu. yani yakalanma riski varmı?

    • yasirkula dedi ki:

      Zaten ücretsiz olan modeller indirdiyseniz, modeli nasıl kullanabileceğiniz veya düzenleyebileceğiniz ile ilgili bilgi almak için modeli indirdiğiniz yerde yazan lisans sözleşmesini okumanız lazım. Ücretli bir modeli ücretsiz indirdiyseniz, bunun fark edilip fark edilmeyeceğini ben de bilmiyorum.

      • Hüseyin dedi ki:

        http://www.cadnav.com
        modellerimi burdan indiriyorum hocam.
        Söylemek istediğim şey 3ds max programıyla modeli yeniden yapılandırsam baya oynama yapsam. Textureleri silip photoshop ile kendim yapsam çakarlarmı diyorum. Sitede ticari amaçla kullanılılabilir yazıyor. Ama ben yinede güvenmiyorum. Ne dersiniz hocam?

      • yasirkula dedi ki:

        Siteyi daha önce duymamıştım ama güvenilir gibi duruyor. İndirdiğiniz Winrar arşivinde açıklama olarak lisans yazıyor. Orada commercial kullanılabilir yazıyorsa ticari kullanabilirsiniz. Sitede bazı modeller için can be modificated yazıyor; bu üzerinde oynama yapılabilir anlamına geliyor diye düşünüyorum ama kelimeye aşina olmadığımdan çok da emin değilim.

    • Hüseyin dedi ki:

      Ticari olanından istediğimiz şekilde para kazanabilir değilmi hocam

      • yasirkula dedi ki:

        Evet kazanabilirsiniz. Ancak ilave bir koşul var mı diye lisans sözleşmesini okumanızı öneririm; genelde kısa oluyorlar zaten.

  4. Hüseyin dedi ki:

    Hocam size bir sorum olacak
    Benim oyunumda bir uçak var.
    Ve uçağımın child objesi olarakta füze var
    Space tuşuna basılınca füzenin uçağın child objesi olmaktan çıkmasını istiyorum
    Füze ayrı bir script ile hareket edecek.Araştırdım ama pek bişey bulamadım

    plane.transform.GetChild(0).parent =

    Yani space tuşuna basılınca füzenin hiç bir parenti olmayacak. Ama füze şuanki konumunda olacak

  5. ahmet dedi ki:

    Merhabalar sadece unityde oyun mu yapıyorsunuz yoksa android studioda android uygulama yada appstore için uygulamada geliştiriyormusunuz

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

w

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.