React-native: [Android] Menghapus izin yang tidak digunakan yang ditambahkan pada waktu pembuatan

Dibuat pada 12 Feb 2016  ·  73Komentar  ·  Sumber: facebook/react-native

_edit: lihat https://medium.com/@applification/fixing -react-native-android-permissions-9e78996e9865 untuk solusi -@hramos_

Sepertinya izin Baca/Tulis penyimpanan eksternal dan Baca status ponsel secara otomatis ditambahkan ke manifes saat membuat apk android. Apakah ini diperlukan untuk semua aplikasi Android React Native? Apakah ada cara untuk menghapus izin ini?

android:menggunakan-izin#android.permission.READ_EXTERNAL_STORAGE
android:menggunakan-izin#android.permission.WRITE_EXTERNAL_STORAGE

Rasanya aneh bahwa saya akan melihat izin ini diminta jika saya menginstal aplikasi dari Play store jika saya tidak menggunakannya.

AsyncStorage Android Ran Commands Locked Discussion

Komentar yang paling membantu

@Bhullnatik apa yang kami lakukan hingga versi baru android-jsc akan dirilis hanyalah menghapus izin yang tidak diinginkan dalam manifes aplikasi kami seperti ini:

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

Semua 73 komentar

Hai lucidrains, terima kasih telah melaporkan masalah ini!

React Native, seperti yang mungkin pernah Anda dengar, menjadi sangat populer dan sebenarnya kami sedikit kewalahan dengan aktivitas di sekitarnya. Ada terlalu banyak masalah untuk kita kelola dengan baik.

  • Jika Anda tidak tahu bagaimana melakukan sesuatu atau sesuatu tidak berfungsi seperti yang Anda harapkan tetapi tidak yakin itu bug , silakan tanyakan di StackOverflow dengan tag react-native atau untuk interaksi waktu nyata lainnya, tanyakan di Discord di # saluran asli-reaksi.
  • Jika ini adalah permintaan fitur atau bug yang ingin Anda perbaiki, harap laporkan di Product Pains . Ini memiliki fitur peringkat yang memungkinkan kami fokus pada masalah terpenting yang dialami komunitas.
  • Kami menyambut isu-isu yang jelas dan PR yang siap untuk diskusi mendalam. Harap berikan tangkapan layar jika perlu dan selalu sebutkan versi React Native yang Anda gunakan. Terima kasih atas kontribusi Anda!

Hapus saja dari AndroidManifest.xml Anda jika Anda tidak membutuhkannya. Saya percaya ini untuk AsyncStorage .

Ada tempat yang bagus untuk memposting kode/mengajukan pertanyaan terlebih dahulu sebelum mengajukan masalah: StackOverflow . Ini adalah sistem terbaik untuk Tanya Jawab. Banyak orang dari komunitas berkumpul di sana dan akan dapat melihat dan menjawab pertanyaan Anda. Ini memungkinkan kami menggunakan pelacak bug github untuk bug.

Saya memposting ini di sini karena masalah github belum bekerja dengan baik untuk kami dan karena StackOverflow jauh lebih baik. Terima kasih sudah membaca! :)

@mkonicek bukankah mereka ditambahkan pada waktu pembuatan? Dalam hal ini tidak mudah untuk menghapusnya

+1

Bahkan ketika Anda tidak memiliki izin BACA dan TULIS di AndroidManifest Anda, izin itu masih muncul di build. Apakah Anda hanya perlu menghapus AsyncStorage sepenuhnya?

Saya memiliki masalah serupa ketika saya membuat apk rilis.

Sebelum menginstal, ia meminta izin:

  • Foto/Media/File
  • ID Perangkat & informasi panggilan

tetapi saya mengonfirmasi bahwa saya menghapus AsyncStorage sepenuhnya dan hanya memiliki

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

di AndroidManifest saya

@mkonicek @satya164 @bestander Bisakah masalah ini dibuka kembali? Saya menggali sedikit, saya tidak dapat menemukan di mana izin itu ditambahkan. Sejauh ini ada:

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

Yang saya tidak yakin apa yang mereka lakukan, tetapi saya rasa sebenarnya tidak ada yang digunakan karena tidak akan berfungsi di Android 6.+ (izin run-time). Juga tampaknya aneh untuk memaksa izin untuk menggunakan modul karena di NetInfoModule di Android, React-native mengharuskan ANDA untuk menambahkan izin yang diperlukan ke manifes Anda (Lihat NetInfoModule.java#L38 ).
Pokoknya itu bukan untuk AsyncStorage karena menggunakan SQLite DB di bawah tenda , yang tidak memerlukan izin apa pun. Meskipun menggunakan metode penyimpanan lain seperti SharedPreferences atau penyimpanan internal untuk menyimpan file, seharusnya tidak memerlukan izin apa pun (Lihat Opsi Penyimpanan ).

Saya yakin ini berasal dari React-native, saya mencoba proyek baru tanpa izin lain, dan ada di sini setelah APK dibuat. Saya juga melihat setiap aplikasi Android di etalase dan setiap aplikasi memiliki izin tersebut, kecuali yang tidak memiliki setidaknya READ_PHONE_STATE : Manajer Iklan Facebook (Lihat _Izin: Lihat detail_ di bagian bawah).

Juga tidak sepenuhnya terkait, tetapi ini juga izin:

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

Izin ini (Gambar di atas aplikasi lain) diperlukan dalam mode debug untuk menampilkan kotak merah kesalahan, tetapi masih ada
dalam mode rilis, yang cukup menakutkan bagi pengguna (meskipun tidak digunakan). Saya mungkin bisa mengirimkan PR untuk itu (memiliki 2 manifes berbeda untuk debug dan rilis, hanya menggunakan izin di debug).

Maaf untuk posting yang panjang, tetapi perusahaan saya sedang dalam proses merilis aplikasi Android baru kami, dan kami benar-benar ingin mengirimkannya tanpa izin yang tidak diperlukan karena itu bukan komunitas Android yang benar-benar suka.

Terima kasih atas perhatian Anda.

Mungkin gradle melakukan itu?
Saya tidak dapat menemukan string apa pun dengan READ_PHONE_STATE dalam kode.
Saya tidak keberatan membuka kembali ini, tetapi bisakah Anda membantu kami menyelidiki ini?

@facebook-github-bot buka kembali

Oke, membuka kembali masalah ini.

@bestander Ya saya pikir itu ditambahkan secara otomatis oleh Android/gradle karena saya tidak dapat menemukan penyebutan mereka dalam kode, tapi saya benar-benar tidak yakin mengapa. Saya akan mencoba menyelidiki dengan cepat dan menghubungi Anda kembali/mengajukan PR segera setelah saya menemukan sesuatu.

Saya lupa memeriksa log penggabungan manifes ... Ternyata masalahnya cukup jelas:

IMPLIED from /Users/mayouk/Dev/tmp/AwesomeProject/android/app/src/main/AndroidManifest.xml:1:1-23:12 reason: org.webkit.android_jsc has a targetSdkVersion < 4
android:uses-permission#android.permission.READ_PHONE_STATE
IMPLIED from /Users/mayouk/Dev/tmp/AwesomeProject/android/app/src/main/AndroidManifest.xml:1:1-23:12 reason: org.webkit.android_jsc has a targetSdkVersion < 4
android:uses-permission#android.permission.READ_EXTERNAL_STORAGE
IMPLIED from /Users/mayouk/Dev/tmp/AwesomeProject/android/app/src/main/AndroidManifest.xml:1:1-23:12 reason: org.webkit.android_jsc requested WRITE_EXTERNAL_STORAGE

Karena android-jsc tidak memberikan targetSdkVersion , penggabungan manifes menambahkan izin karena berbagai alasan (Lihat Izin implisit ). Rupanya @astuetz sudah memperbaiki ini di https://github.com/facebook/Android-jsc/pull/12 tetapi versi baru android-jsc tidak diterbitkan atau tidak digunakan di React-native saat ini. Jika Anda dapat menghubungi pengelola android-jsc untuk menyelesaikan ini, itu akan luar biasa!

@brentvatne ping, apakah mungkin untuk menerbitkan android-jsc baru?

@Bhullnatik apa yang kami lakukan hingga versi baru android-jsc akan dirilis hanyalah menghapus izin yang tidak diinginkan dalam manifes aplikasi kami seperti ini:

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

@astuetz Saya sedang melihat penggabungan manifes tentang cara memperbaikinya sampai diselesaikan, terima kasih atas perhatiannya

@bestander - yakin saya bisa melakukannya, kami mungkin juga ingin memperbarui ke r189384 @kmagiera?

@astuetz terima kasih, itu membantu saya, hanya untuk menambah info ini saya harus mendeklarasikan atribut alat di

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.bepaw.esportninja">. 

Secara default hanya ada xmlns:Android , tidak ada xmlns:tools

@bestander @brentvatne Hei! Ada pembaruan tentang ini?

👍 +1 untuk ini.

Saya merasa penghapusan SYSTEM_ALERT_WINDOW dari build rilis jauh lebih penting daripada izin lain yang sedang dibahas.

@marcshilling Sama pentingnya untuk menghapusnya menurut saya, tetapi yang ini sedikit lebih rumit. Cara termudah untuk menghapusnya adalah dengan menghapusnya di rilis AndroidManifest.xml , tetapi konfigurasinya agak berat untuk disertakan dalam setiap proyek React Native.
Cara lain adalah dengan menghapus penggunaan, sehingga tidak memerlukan izin lagi. Untuk itu saya tidak yakin di mana/untuk apa itu digunakan, tetapi saya tidak melihat kebutuhan khusus yang tidak dapat dipenuhi dengan sesuatu yang lain. Aku bisa saja salah.

Bagi mereka yang ingin mengecualikan SYSTEM_ALERT_WINDOW dari rilis build tanpa file Manifest terpisah:

Dalam manifes Anda:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:remove="${excludeSystemAlertWindowPermission}"/>

Dalam app/build.gradle :

    buildTypes {
        debug {
            manifestPlaceholders = [excludeSystemAlertWindowPermission: "false"]
        }
        release {
            manifestPlaceholders = [excludeSystemAlertWindowPermission: "true"]
        }
    }

Tampaknya bekerja dengan baik.

@marcshilling Sempurna! Terima kasih! Agak memalukan harus menjelaskan itu kepada pengguna karena saya tidak tahu cara menghapusnya. 😕

Hai, Saya telah diperingatkan tentang READ_PHONE_STATE oleh pengguna salah satu aplikasi saya.

Saya mendapatkan alasan yang sama di log build

reason: org.webkit.android_jsc has a targetSdkVersion < 4

Mudah-mudahan itu akan diselesaikan dalam rilis mendatang.

Untuk saat ini, saya menggunakan solusi penghapusan izin yang disebutkan di sini
astuetz - READ_PHONE_STATE - https://github.com/facebook/react-native/issues/5886#issuecomment -200869879
marcshilling - SYSTEM_ALERT_WINDOW - https://github.com/facebook/react-native/issues/5886#issuecomment -224397883

Serta menambahkan namespace seperti yang dijelaskan oleh mouneyrac (https://github.com/facebook/react-native/issues/5886#issuecomment-209218936)

Jadi, saya tidak dapat menghapus SYSTEM_ALERT_WINDOW dengan solusi di atas.

Harus menggunakan peretasan (setelah banyak dorongan dan tusukan).

di AndroidManifest.xml

    <uses-permission android:name="${permissionName}" tools:node="remove"/>

di app/build.gradle

    buildTypes {
        debug {
            manifestPlaceholders = [permissionName: "android.permission.ACCESS_FINE_LOCATION"]
            ...
        }    
        release {
            manifestPlaceholders = [permissionName: "android.permission.SYSTEM_ALERT_WINDOW"]
            ...
        }
    }

Dalam mode debug, saya menghapus ACCESS_FINE_LOCATION, karena saya tidak menggunakan (baik di dev maupun di prod). Izin lain yang tidak penting dapat digunakan (BIND_TV_INPUT?).

Dalam mode rilis, saya menghapus SYSTEM_ALERT_WINDOW. Jika Anda tidak menghapusnya secara paksa, itu akan digabungkan.

Hacky, tapi efektif 😂

Jika Anda menggunakan solusi ini https://github.com/facebook/react-native/issues/5886#issuecomment -224397883, jangan lupa untuk menambahkan xmlns:tools seperti yang dijelaskan di sini: https://github.com /facebook/react-native/issues/5886#issuecomment -209218936

@marcshilling Saya pikir ini adalah sesuatu yang bisa kita miliki di template generator secara default.

@marcshilling Solusi Anda tidak berhasil untuk saya juga, tetapi solusi dari @jbrodriguez berhasil.

Satu hal yang saya perhatikan adalah bahwa alih-alih menggunakan izin nyata yang akan dihapus, Anda juga dapat menggunakan nama izin yang tidak ada seperti REMOVE_ME .

Komentar cepat: setelah memperbarui dari 0,30 ke 0,32 tampaknya reaksi asli sekarang tiba-tiba menambahkan izin com.google.android.c2dm.permission.RECEIVE Saya telah melihat ini di dua aplikasi sekarang. Saya ragu itu membutuhkan izin baru ini juga.

Penggunaan @marcshilling 's tools:remove juga tidak berfungsi untuk saya.

Solusi saya untuk menghindari izin yang tidak perlu (campuran di atas) adalah:
Di app/src/main/AndroidManifest.xml , saya menambahkan:

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

Dan dalam app/src/release/AndroidManifest.xml baru dibuat, saya memasukkan:

<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    >

    <!-- These are added by React Native for debug mode, but actually aren't needed in releasemode -->
    <uses-permission tools:node="remove" android:name="android.permission.SYSTEM_ALERT_WINDOW" />
</manifest>

Substitusi variabel di dalam tools:node tidak berfungsi untuk saya, jadi sesuatu seperti tools:node="${someManifestPlaceholder}" tidak akan berfungsi. Jadi pendekatan di atas dari beberapa file AndroidManifest.xml yang bergabung bersama tampaknya merupakan metode yang lebih baik untuk menambah/menghapus izin tertentu dengan basis debug vs release (atau default main ).

@marcshilling solusi Anda tidak berhasil untuk saya, jadi saya telah menggunakan @jbrodriguez 's dikombinasikan dengan @astuetz 's

menurut kalian apakah perlu membuat skrip untuk mengotomatisasi ini?

mungkin membuat paket npm yang membuat ini di instal dan kemudian menghapusnya sendiri?
Tidak pernah melakukan sesuatu seperti itu meskipun saya percaya itu mungkin.

@mikelambert , mengenai pendekatan Anda , apakah ada hal lain yang diperlukan untuk membuatnya berfungsi?

apakah gradle secara otomatis menggabungkan app/src/release/AndroidManifest.xml menjadi app/src/main/AndroidManifest.xml ?

itu sepertinya pendekatan yang lebih bersih bagi saya

Pikiran dan komentar dihargai! :)

Ya, itu secara otomatis menggabungkan file AndroidManifest.xml . Saya percaya itu semua yang diperlukan untuk membuatnya bekerja untuk saya, tetapi beri tahu saya jika saya melewatkan sesuatu!

@mikelambert juga bekerja untuk saya. Saya memiliki beberapa tipe build rilis, jadi saya membutuhkan release{X}/AndroidManifest.xml untuk setiap tipe build agar bisa berfungsi.

Tidak yakin bagaimana Anda bisa menangkap sesuatu seperti itu dalam paket npm..

Perbaikan yang tepat (IMO) adalah mengatur ini sebagai bagian dari proyek ketika react-native init dijalankan. yaitu, sesuatu yang mirip dengan cara ini digunakan dalam penyiapan proyek awal:
https://github.com/facebook/react-native/blob/master/local-cli/templates/HelloWorld/android/app/src/main/AndroidManifest.xml

@freakinruben semua yang Anda lakukan secara manual dapat dilakukan dalam skrip;)
versi pertama skrip akan menjadi dasar, dan hanya mendukung versi rilis/debug

nanti kami dapat meminta pengguna untuk lebih banyak konfigurasi

@mikelambert pastinya, kita semua meretas hal ini di sini sampai solusi yang tepat akan digabungkan oleh tim asli reaksi :)

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

Halo semua,

Berhati-hatilah dengan membiarkan RN menambahkan izin ini untuk Anda android.permission.READ_PHONE_STATE . Jika Anda mencoba memublikasikan aplikasi ke Google Play Store dengan izin tersebut (antara lain), aplikasi akan memperingatkan Anda dengan:

Aplikasi Anda memiliki apk dengan kode versi X yang meminta izin berikut: android.permission.READ_PHONE_STATE. Aplikasi yang menggunakan izin ini dalam APK harus memiliki kebijakan privasi yang ditetapkan.

Info lebih lanjut: https://play.google.com/intl/en-US_ALL/about/privacy-security/additional-requirements/. Jadi ya, berhati-hatilah dan pastikan untuk menghapus izin ini jika Anda tidak membutuhkannya sampai ini diperbaiki di RN. Saya merasa ini harus didokumentasikan di suatu tempat untuk saat ini agar orang-orang dengan niat melepaskannya sadar.

Solusi @mikelambert bekerja untuk saya. Terima kasih.

@mikelambert Terima kasih atas solusi terbaiknya.

@ferrannp itu sebenarnya alasan mengapa saya sampai di sini. :) dan solusinya bekerja dengan baik.

Rekap kecil sejak 15 Maret sudah dekat:

schermata 2017-03-13 alle 17 29 25

@mmazzarolo apa yang terjadi pada 15 Maret (besok)?

@antoinerousseau : Aturan Kebijakan Privasi Baru Google Play Mulai Berlaku pada 15 Maret , dan READ_PHONE_STATE adalah salah satu izin yang akan memaksa Anda untuk memublikasikan dokumen Kebijakan Privasi di Play Store dan aplikasi itu sendiri.

build.gradle

        classpath 'com.android.tools.build:gradle:1.2.3' // For Android 5.1

Aturan berikut mogok pada 5.1:

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:node="remove"/>
06-02 15:06:54.102: E/AndroidRuntime(18353): android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W<strong i="11">@f03a0a2</strong> -- permission denied for this window type
06-02 15:06:54.102: E/AndroidRuntime(18353):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:704)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:289)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at android.app.Dialog.show(Dialog.java:311)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at com.facebook.react.devsupport.DevSupportManagerImpl.showProgressDialog(DevSupportManagerImpl.java:762)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at com.facebook.react.devsupport.DevSupportManagerImpl.reloadJSFromServer(DevSupportManagerImpl.java:767)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at com.facebook.react.devsupport.DevSupportManagerImpl.handleReloadJS(DevSupportManagerImpl.java:658)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at com.facebook.react.XReactInstanceManagerImpl$3$1.run(XReactInstanceManagerImpl.java:412)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at android.os.Handler.handleCallback(Handler.java:815)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at android.os.Handler.dispatchMessage(Handler.java:104)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at android.os.Looper.loop(Looper.java:194)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at android.app.ActivityThread.main(ActivityThread.java:5631)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at java.lang.reflect.Method.invoke(Native Method)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at java.lang.reflect.Method.invoke(Method.java:372)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
06-02 15:06:54.102: E/AndroidRuntime(18353):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)

Solusinya adalah menghapus:

tools:node="remove

@iegik , saya tidak yakin solusi/kode siapa yang Anda coba, tetapi menambahkan izin SYSTEM_ALERT_WINDOW untuk merilis build bukanlah solusi yang akan saya rekomendasikan kepada orang lain.

Silakan coba saran saya di atas, jika Anda tidak ingin meminta izin itu di build rilis Anda.

@a-koka sudah dijelaskan di atas beberapa kali

@mikelambert Saya harus meminta izin SYSTEM_ALERT_WINDOW dari pengguna, karena aplikasi kami mogok di suatu tempat saat mendapatkan izin :(

@iegik Dari apa yang saya pahami, aplikasi mode rilis normal tidak perlu SYSTEM_ALERT_WINDOW , dan itu hanya berguna untuk aplikasi mode pengembangan. Apakah Anda memiliki log kecelakaan tersebut, yang menunjukkan di mana "suatu tempat" ini?

Tentu saja, Anda boleh melakukannya jika itu sesuai dengan kebutuhan Anda dan tidak layak untuk di-debug untuk Anda... Saya hanya tidak ingin pembaca utas ini di masa mendatang berpikir bahwa mereka perlu meminta izin itu juga, karena utas ini adalah tentang bagaimana tidak meminta izin yang tidak perlu. :)

Menambahkan baris ini, membuat aplikasi saya macet.
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />

@npaez , benar

bukan itu yang dilakukan node="remove ". Ini menghapus izin dari manifes yang dihasilkan, karena perpustakaan lain, misalnya, dapat menambahkan izin. Ini memastikan izin pasti tidak akan ada.
— Bangau di Discord

Metode @marcshilling berhasil. (y)

Ini tidak boleh ditutup karena RN masih menambahkan izin ini secara implisit:

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

yang sangat buruk. Saya memiliki nomor telepon dan IMEI Anda jika Anda menginstal aplikasi saya semacam izin. Saya tidak ingin menginstal aplikasi apa pun yang meminta ini ...

@johnculviner omong-omong, apakah ini berfungsi ketika Anda mencoba mengambil IMEI? karena saya mencoba menggunakan react-native-device-info dan tidak berfungsi, saya mencoba menggunakan react-native-Imei yang telah ditinggalkan sejak RN 0.47 memberi saya kesalahan metode tidak menimpa atau menerapkan, apakah Anda punya solusi untuk masalah saya ?

@koswarabilly Saya cukup yakin izin di atas adalah salah satu persyaratan untuk IMEI yang jelas merupakan hal yang cukup tinggi untuk diminta mengingat secara unik mengidentifikasi telepon selamanya

@johnculviner saya tahu izin memberi saya akses ke info perangkat, saya telah mencoba untuk mendapatkan imei melalui paket react-native-imei tetapi ketika saya menjalankan-Android itu meminta saya mengatakan kesalahan menimpa atau tidak menerapkan metode, apakah Anda pernah berhasil mendapatkannya Nomor IMEI perangkat Anda
Atau adakah yang berhasil mengambil nomor imei di sini? Karena saya percaya bahwa itu adalah tugas yang mungkin

Saya menggunakan React Native v0.44.0 dan mencoba memutakhirkan ke SDK 26, tetapi sistem Android tidak mengizinkan SYSTEM_ALERT_WINDOW digunakan lagi bahkan dalam mode debug. SYSTEM_ALERT_WINDOW hanya dapat digunakan oleh aplikasi tingkat sistem di Oreo. Adakah ide tentang bagaimana saya bisa membuat ini berhasil?

Bagi siapa pun yang mencoba menyelesaikan ini, dalam posting ini orang tersebut menggunakan solusi yang tercantum di sini tetapi dijelaskan dengan sangat baik.
https://medium.com/@applification/fixing -react-native-android-permissions-9e78996e9865

@mikelambert Terima kasih, solusi Anda bekerja dengan sempurna

Solusi bagi saya adalah memodifikasi
./android/app/src/main/AndroidManifest.xml

Saya harus menambahkan baris berikut

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
// Added this
    xmlns:tools="http://schemas.android.com/tools"
    package="de.democracydeutschland.app"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
// Added tools:node="remove"
    <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove"/>
// Added READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE both with tools:node="remove"
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="22" />

    ...

Untuk Tujuan Debug: ./android/app/build/outputs/logs/manifest-merger-***-report.txt

Rel: https://github.com/demokratie-live/democracy-client/blob/master/android/app/src/main/AndroidManifest.xml

Ini menghapus Dialog Izin Aplikasi saat menginstal melalui PlayStore

Satu hal yang saya tidak mengerti:

Mengapa saya harus menambahkan hak untuk menghapusnya sementara aplikasi itu sendiri bahkan tidak memerlukan izin?

Gruße Ulf

<3

"Koreksi" akan ditambahkan di versi berikutnya dari React-native ?

Aplikasi kami memiliki beberapa tipe build (4 sampai sekarang), dan kami ingin menghapus izin SYSTEM_ALERT_WINDOW dari semuanya KECUALI debug .
Saya tidak ingin meretas nama izin melalui placeholder manifes, atau membuat 3 AndroidManifest tambahan dengan konten yang sama.
Jadi, pada akhirnya saya menghapus izin di main/AndroidManifest.xm l menggunakan:

<manifest xmlns:tools="http://schemas.android.com/tools" ...>
<uses-permission tools:node="remove" android:name="android.permission.SYSTEM_ALERT_WINDOW" />
...

dan kemudian di debug/AndroidManifest.xml terpisah, saya menambahkannya kembali :

<manifest xmlns:tools="http://schemas.android.com/tools" ...>
<uses-permission tools:node="merge" android:name="android.permission.SYSTEM_ALERT_WINDOW" />
...

Karena debug AndroidManifest memiliki prioritas lebih tinggi daripada main (lihat Merge Priorities ), itu akan menimpa penghapusan dan menambahkan izin.

Kedengarannya aneh, tetapi tampaknya berfungsi dengan baik (dilihat dari output aapt d permissions <apk file> ).

Kongres seharusnya bertanya pada Zuck ada apa dengan izin ini.

Saya pikir solusinya adalah membuat android/app/src/release/AndroidManifest.xml seperti ini:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.facebook.react.demo">

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

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

    <application>

    </application>

</manifest>

Dan edit android/app/build.gradle seperti ini:

android {
    ...
    sourceSets.release {
        manifest.srcFile 'release/AndroidManifest.xml'
    }
}

https://code.videolan.org/videolan/vlc-android/blob/923bbada6687ecab31addc1dfd3f90619976ccdf/vlc-android/build.gradle#L169

@dulmandakh Ini tidak relevan dengan masalah sama sekali. Izin ditambahkan ke Manifes saat membuat APK, izin tersebut tidak ada dalam template default (seperti yang disebutkan dalam edisi asli dan di https://github.com/facebook/react-native/issues/5886#issuecomment-200862582 ). Bisakah Anda membuka kembali masalah ini?

@dulmandakh ini seharusnya tidak ditutup. Izin ditambahkan pada waktu pembuatan, tidak terkait dengan file tertaut Anda

Ini tampaknya menjadi panduan resmi untuk menghapus izin default:
http://facebook.github.io/react-native/docs/removing-default-permissions

saya tidak tahu apakah ini terkait dengan forum ini atau tidak.

jadi karena perubahan aturan izin konsol google play baru-baru ini. Google akan memeriksa manifes kami untuk melihat izin Android yang kami gunakan.

meskipun saya telah menggunakan ' tools:node= "remove"' di setiap izin yang tidak digunakan dan di aplikasi rilis izin tidak ditampilkan. Google masih tidak mengizinkan saya untuk memublikasikan aplikasi saya di konsol google play.

ada yang punya masalah seperti ini? saya mendapat masalah ini 27-01-2019.

Sebagai tindak lanjut dari Manifest kami yang saat ini digunakan:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="de.democracydeutschland.app">

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

    <!-- Default permissions which are added silently and not needed by us - hence we remove them -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />

    <!-- This needs to be added in dev mode but removed in all others
         since this config is used for production aswell we need to remove it here -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:node="remove" />

    <!-- included from rn-fetch-blob - implications of removal are unknown -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" tools:node="remove" />

    ...
</manifest>

Manifes Utama

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="de.democracydeutschland.app">

    <!-- This needs to be added in dev mode but removed in all others -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" tools:node="replace" />

</manifest>

Manifes Rasa Dev

Izin yang disebutkan di atas secara implisit ditambahkan oleh Android SDK karena JSC lama atau JavaScriptCore menargetkan SDK 4. Di master kami memiliki JSC baru dan akan digunakan default di 0,59. Jadi tidak ada yang bisa kita lakukan untuk itu. Silakan lihat https://developer.android.com/studio/build/manifest-merge

Satu-satunya cara untuk menghapus SYSTEM_ALERT_WINDOW adalah dengan mengikuti instruksi reaksi resmi untuk membuat file manifes baru untuk rilis.

Mungkin dulu bekerja dengan menggunakan manifestPlaceholder tetapi pasti ada perubahan atau versi alat build yang melanggarnya.

@hammadzz terima kasih telah mengingatkan kami tentang izin yang tidak digunakan, dan saya membuat PR untuk memperbaikinya https://github.com/facebook/react-native/pull/23504. Saya berharap itu akan segera mendarat di master dan cherry dipetik untuk 0,59.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat