Follwing es el archivo build.gradle de mi aplicación que fue desarrollado usando react native. Debido a la nueva restricción de establecer targetSdkVersion en 26, se bloquea al cargar mapas nativos de reacción. Uso react-native v 0.44.0 y react-native-maps v 0.19.0. ¿Alguien ha experimentado tal escenario y ha encontrado una solución?

apply plugin: "com.android.application"

import com.android.build.OutputFile


/**
 * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
 * and bundleReleaseJsAndAssets).
 * These basically call `react-native bundle` with the correct arguments during the Android build
 * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
 * bundle directly from the development server. Below you can see all the possible configurations
 * and their defaults. If you decide to add a configuration block, make sure to add it before the
 * `apply from: "../../node_modules/react-native/react.gradle"` line.
 *
 * project.ext.react = [
 *   // the name of the generated asset file containing your JS bundle
 *   bundleAssetName: "index.android.bundle",
 *
 *   // the entry file for bundle generation
 *   entryFile: "index.android.js",
 *
 *   // whether to bundle JS and assets in debug mode
 *   bundleInDebug: false,
 *
 *   // whether to bundle JS and assets in release mode
 *   bundleInRelease: true,
 *
 *   // whether to bundle JS and assets in another build variant (if configured).
 *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
 *   // The configuration property can be in the following formats
 *   //         'bundleIn${productFlavor}${buildType}'
 *   //         'bundleIn${buildType}'
 *   // bundleInFreeDebug: true,
 *   // bundleInPaidRelease: true,
 *   // bundleInBeta: true,
 *
 *   // the root of your project, i.e. where "package.json" lives
 *   root: "../../",
 *
 *   // where to put the JS bundle asset in debug mode
 *   jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
 *
 *   // where to put the JS bundle asset in release mode
 *   jsBundleDirRelease: "$buildDir/intermediates/assets/release",
 *
 *   // where to put drawable resources / React Native assets, e.g. the ones you use via
 *   // require('./image.png')), in debug mode
 *   resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
 *
 *   // where to put drawable resources / React Native assets, e.g. the ones you use via
 *   // require('./image.png')), in release mode
 *   resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
 *
 *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
 *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
 *   // date; if you have any other folders that you want to ignore for performance reasons (gradle
 *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
 *   // for example, you might want to remove it from here.
 *   inputExcludes: ["android/**", "ios/**"],
 *
 *   // override which node gets called and with what additional arguments
 *   nodeExecutableAndArgs: ["node"],
 *
 *   // supply additional arguments to the packager
 *   extraPackagerArgs: []
 * ]
 */

apply from: "../../node_modules/react-native/react.gradle"

/**
 * Set this to true to create two separate APKs instead of one:
 *   - An APK that only works on ARM devices
 *   - An APK that only works on x86 devices
 * The advantage is the size of the APK is reduced by about 4MB.
 * Upload all the APKs to the Play Store and people will download
 * the correct one based on the CPU architecture of their device.
 */
def enableSeparateBuildPerCPUArchitecture = false

/**
 * Run Proguard to shrink the Java bytecode in release builds.
 */
def enableProguardInReleaseBuilds = false

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.test.testapp"
        minSdkVersion 16
        targetSdkVersion 26
        versionCode 1
        versionName "1.0.0-beta"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
    signingConfigs {
        release {
            if (project.hasProperty('APP_RELEASE_STORE_FILE')) {
                storeFile file(APP_RELEASE_STORE_FILE)
                storePassword APP_RELEASE_STORE_PASSWORD
                keyAlias APP_RELEASE_KEY_ALIAS
                keyPassword APP_RELEASE_KEY_PASSWORD
            }
        }
    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
            signingConfig signingConfigs.release
        }
    }
    // applicationVariants are e.g. debug, release
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // For each separate APK per architecture, set a unique version code as described here:
            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
            def versionCodes = ["armeabi-v7a":1, "x86":2]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
            }
        }
    }
}

dependencies {
    compile project(':react-native-splash-screen')
    compile project(':react-native-version-check')
    compile project(':react-native-version-number')
    compile(project(':react-native-fcm')){
        exclude group: "com.google.firebase"
    }

    compile project(':react-native-background-timer')
    //compile project(':react-native-photo-view')
    //compile project(':react-native-share')
    compile project(':react-native-linear-gradient')
    compile project(':react-native-vector-icons')
    compile project(':react-native-fetch-blob')
    compile(project(':react-native-maps')){
        //exclude group: 'com.google.android.gms', module: 'play-services-base'
        //exclude group: 'com.google.android.gms', module: 'play-services-maps'
        exclude group: 'com.google.android.gms'
    }
    //compile 'com.google.android.gms:play-services-base:10.0.1'
    //compile 'com.google.android.gms:play-services-maps:10.0.1'
    compile(project(':react-native-google-places')){
        //exclude group: 'com.google.android.gms', module: 'play-services-base'
        //exclude group: 'com.google.android.gms', module: 'play-services-places'
        //exclude group: 'com.google.android.gms', module: 'play-services-location'
        exclude group: 'com.google.android.gms'
    }
    //compile 'com.google.android.gms:play-services-base:10.2.0'
    //compile 'com.google.android.gms:play-services-places:10.2.0'
    //compile 'com.google.android.gms:play-services-location:10.2.0'
    compile project(':react-native-geo-fencing')
    compile project(':realm')
    compile fileTree(dir: "libs", include: ["*.jar"])
    compile "com.android.support:appcompat-v7:23.0.1"
    compile "com.facebook.react:react-native:+"  // From node_modules
    compile ("com.google.android.gms:play-services-base:10.2.4") {
        force = true;
    }
    compile ("com.google.android.gms:play-services-maps:10.2.4") {
        force = true;
    }
    compile ("com.google.android.gms:play-services-places:10.2.4") {
        force = true;
    }
    compile ("com.google.android.gms:play-services-location:10.2.4") {
        force = true;
    }
    compile ("com.google.android.gms:play-services-gcm:10.2.4") {
        force = true;
    }
    compile ('com.google.firebase:firebase-core:10.2.4') {
        force = true;
    }
    compile ('com.google.firebase:firebase-messaging:10.2.4') {
        force = true;
    }
}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}

apply plugin: 'com.google.gms.google-services'

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.testapp"
    xmlns:tools="http://schemas.android.com/tools"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission tools:node="remove" android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission tools:node="remove" android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission tools:node="remove" android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!--<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />-->
    <uses-permission android:name="android.permission.VIBRATE" />

Excepción

09-08 17:32:19.977 10859-10859/com.test.testapp I/lrides.custome: The ClassLoaderContext is a special shared library.
09-08 17:32:20.041 10859-10895/com.test.testapp E/unknown:React: Exception in native call
                                                                       java.lang.SecurityException: Looks like the app doesn't have the permission to access location.
                                                                       Add the following line to your app's AndroidManifest.xml:
                                                                       <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
                                                                           at com.facebook.react.modules.location.LocationModule.throwLocationPermissionMissing(LocationModule.java:234)
                                                                           at com.facebook.react.modules.location.LocationModule.getCurrentPosition(LocationModule.java:138)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.facebook.react.bridge.BaseJavaModule$JavaMethod.invoke(BaseJavaModule.java:368)
                                                                           at com.facebook.react.cxxbridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:138)
                                                                           at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
                                                                           at android.os.Handler.handleCallback(Handler.java:873)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                           at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31)
                                                                           at android.os.Looper.loop(Looper.java:193)
                                                                           at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:208)
                                                                           at java.lang.Thread.run(Thread.java:764)
                                                                        Caused by: java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.
                                                                           at android.os.Parcel.createException(Parcel.java:1942)
                                                                           at android.os.Parcel.readException(Parcel.java:1910)
                                                                           at android.os.Parcel.readException(Parcel.java:1860)
                                                                           at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:866)
                                                                           at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1420)
                                                                           at com.facebook.react.modules.location.LocationModule.getCurrentPosition(LocationModule.java:129)
                                                                           at java.lang.reflect.Method.invoke(Native Method) 
                                                                           at com.facebook.react.bridge.BaseJavaModule$JavaMethod.invoke(BaseJavaModule.java:368) 
                                                                           at com.facebook.react.cxxbridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:138) 
                                                                           at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method) 
                                                                           at android.os.Handler.handleCallback(Handler.java:873) 
                                                                           at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                           at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31) 
                                                                           at android.os.Looper.loop(Looper.java:193) 
                                                                           at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:208) 
                                                                           at java.lang.Thread.run(Thread.java:764) 
                                                                        Caused by: android.os.RemoteException: Remote stack trace:
                                                                           at com.android.server.LocationManagerService.checkResolutionLevelIsSufficientForProviderUse(LocationManagerService.java:1492)
                                                                           at com.android.server.LocationManagerService.getLastLocation(LocationManagerService.java:2219)
                                                                           at android.location.ILocationManager$Stub.onTransact(ILocationManager.java:159)
                                                                           at android.os.Binder.execTransact(Binder.java:731)
09-08 17:32:20.118 10859-10859/com.test.testapp W/lrides.custome: Unsupported class loader
09-08 17:32:20.123 10859-10859/com.test.testapp W/lrides.custome: Skipping duplicate class check due to unsupported classloader
09-08 17:32:20.168 10859-10859/com.test.testapp I/Google Maps Android API: Google Play services client version: 10240000
09-08 17:32:20.174 10859-10859/com.test.testapp I/Google Maps Android API: Google Play services package version: 12862027
09-08 17:32:20.269 10859-10868/com.test.testapp W/System: A resource failed to call release. 
0
Shanaka 8 sep. 2018 a las 14:46

3 respuestas

La mejor respuesta

Aunque los permisos están en AndroidManifest.xml debido a los cambios en la concesión de permisos de Android después de que el permiso SDK 23 debe solicitarse dentro de la aplicación. De lo contrario, se considerará que no se otorgan los permisos. La aplicación se bloqueó porque no solicité los permisos por separado, aunque actualicé targetSdkVersion a 26.

El permiso se puede volver a solicitar como se explica en reaccionar documentación nativa

0
Shanaka 8 sep. 2018 a las 15:07

react-native v 0.44.0 no proporciona soporte para android oroe es decir, API 26.

Necesita usar la versión> = 0.49.0 para reaccionar nativo.

Aquí está la nota de lanzamiento de la versión 0.49.0

Una cosa más que he notado es el permiso. Como dice claramente su error app doesn't have the permission to access location.Add the following line to your app's AndroidManifest.xml: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />, simplemente no agregó este permiso en su archivo de manifiesto

0
Ravi 8 sep. 2018 a las 12:11
<uses-library
    android:name="org.apache.http.legacy"
    android:required='false' />

En androidmanifest.xml

0
Umair Riaz 5 may. 2019 a las 07:42