λͺ¨λ μλ νμλκΉ! Googleμ μ ν리μΌμ΄μ μ΄ Google Playμ κ²μλκΈ° μν΄ μ€μν΄μΌ νλ κΆν λ° μμΉ κΆν μ μ± μ μ λ°μ΄νΈνμ΅λλ€.
μ μ μ± μ λ°±κ·ΈλΌμ΄λμμ μ¬μ©μμ μμΉμ μ‘μΈμ€ν μ μλ κ°λ₯μ±μ μ νν©λλ€. ν¬κ·ΈλΌμ΄λμμλ§ μμΉμ μ‘μΈμ€ν μ μλ κ°λ₯μ±μ΄ μμΌλ©΄ μ’μ κ²μ λλ€.
νΉν μ΄μ 맀λνμ€νΈμμ ACCESS_BACKGROUND_LOCATION κΆνμ μμ²νκ³ μ¬κΈ°μ μ 곡λ μ§μΉ¨μ λ°λΌμΌ ν©λλ€.
μμ© νλ‘κ·Έλ¨μ΄ μ μ μ±
μ μ€μνμ§ μλ κ²½μ° μ΄μ μ μ¬ν μ€λ₯ λ©μμ§μ ν¨κ» μ
λ°μ΄νΈκ° κ±°λΆλ©λλ€.
Background location access not declared
We detected that your app contains at least one feature that requests background location access, however you have not submitted a permission declaration form for this feature. Please log in to your Play Console and submit a declaration form.
μλ‘μ΄ κΈ°λ₯μ μ¬μ©νκ±°λ κΈ°μ‘΄ κΈ°λ₯μ 맀κ°λ³μλ₯Ό μΆκ°νμ¬ κ΅¬νν μ μλ λ κ°μ§ μλ‘μ΄ κΈ°λ₯μ΄ μμ΄μΌ ν©λλ€.
μ μλ μμ μ ν΅ν΄ νλ μμν¬λ μ±μ΄ λ°±κ·ΈλΌμ΄λμ μκ±°λ κΊΌμ Έ μμ λ μ΄λ€ μ’ λ₯μ νλλ μννμ§ μκ³ μ ν리μΌμ΄μ μ΄ νμ±νλ κ²½μ°μλ§ μ¬μ©μμ μμΉμ μ‘μΈμ€ν΄μΌ ν©λλ€.
Fulvio, ν΄κ²°μ± μ μ°Ύμ μ μμ΅λκΉ? μ λ κ°μ λ¬Έμ μ λλ€.
μ λ κ°μ λ¬Έμ μ λλ€. μ€μ λ‘ λ΄ μ±μ λ°±κ·ΈλΌμ΄λμμ μμΉλ₯Ό μ¬μ©νμ§ μμ΅λλ€. νμ§λ§ κ΅¬κΈ νλ μ΄λ λμκ² λ§νλ€ : λΉμ μ λ°±κ·ΈλΌμ΄λμμ μμΉμμ μ¬μ©νκ³ μμ΅λλ€. μ΄ νλ¬κ·ΈμΈ λλ¬Έμ μμ© νλ‘κ·Έλ¨μ΄ λ°±κ·ΈλΌμ΄λ μμΉμ μ‘μΈμ€ν μ μλ κΆνμ΄ μλ€κ³ μκ°ν©λλ€.
νλ¬κ·ΈμΈμ λ°±κ·ΈλΌμ΄λμμ μμΉμ μ‘μΈμ€νμ§ μμ΅λλ€. λ§μ΄ μμ²ν κΈ°λ₯μ΄μ§λ§ μμ§ κ΅¬ννμ§ λͺ»νμ΅λλ€.
AndroidManifest.xml νμΌμ λμ΄λ ACCESS_BACKGROUND_LOCATION
κΆνμ΄ μλμ§ νμΈν μ μμ΅λκΉ? κ·Έλ λ€λ©΄ μ κ±°νμμμ€. μ΄ νλ¬κ·ΈμΈμ΄ μλνλ λ° νμνμ§ μμ΅λλ€.
μ°λ¦¬λ κ°μ λ¬Έμ κ° μμ΅λλ€... μ΄λ―Έ 맀λνμ€νΈ νμΌμμ κΆνμ μ κ±°νκ³ λ€λ₯Έ ν¨μΉλ₯Ό 보λμ§λ§ Googleμμ λΉλλ₯Ό κ³μ κ±°λΆν©λλ€.
λͺ¨λ μ’μ μμΉ¨μ λλ€. @mvanbeusekom κ³ λ €
@marcuslindemannrohden μ λ μμΈλ₯Ό μ μΆνμ§ μκ³ (μ¦, μ±μ΄ μ μ μ± μ μ€μνμ§ μλλ€κ³ μ μΈνμ§ μκ³ ) Play μ€ν μ΄μμ μ λ²μ μ μ ν리μΌμ΄μ μ μμ§ μΆμνμ§ λͺ»νμ΅λλ€.
ACCESS_BACKGROUND_LOCATIONμ 맀λνμ€νΈμ μΆκ°νμ§ μμμ§λ§ μ΄ Google 리μμ€ μμ μ΄ν΄νλ ν μ°λ¦¬κ° 29 λ―Έλ§μ API λ²μ μ λμμΌλ‘ νκΈ° λλ¬Έμ κΆνμ΄ μλμΌλ‘ μΆκ°λμμ΅λλ€.
@mvanbeusekom (λ¬Όλ‘ μ΄ μ§λ¬Έμ μ΄ λΌμ΄λΈλ¬λ¦¬μ λͺ¨λ μ¬μ©μλ₯Ό λμμΌλ‘ ν©λλ€ π) 10μ ν λ¬ λμ μ ν리μΌμ΄μ μ κ²μνκ±°λ μ λ°μ΄νΈν μ μμλμ? μ΄λ¬ν μλ―Έμμ κ·νμ κ²½νμ 곡μ νλ©΄ λ§€μ° λμμ΄ λ κ²μ λλ€!
Goodmorning @fbambushi , μ΄ νΌλλ°±μ λν΄ λλ¨ν κ°μ¬ν©λλ€.
10μ μ΄νλ‘ μ΄ νλ¬κ·ΈμΈμ΄ ν¬ν¨λ Play μ€ν μ΄μ μ±μ μ μΆνμ§ μμμΌλ―λ‘ μμ§ μ΄ λμμ κ²½ννμ§ λͺ»νμ΅λλ€. κ·Έλ¬λ μ 곡λ μλ£λ₯Ό μμΈν μ΄ν΄λ³΄κ³ μ΄ν΄ν μ μλμ§ νμΈνκ³ κ°λ₯ν μ루μ μ λν΄ λ ΌμνκΈ° μν΄ μ¬κΈ°μμ μ λ°μ΄νΈλ₯Ό μ 곡ν κ²μ λλ€. μ λ νμ¬ #546 λ° #556 λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ Έλ ₯νκ³ μμΌλ©°, λ°λ‘ κ·Έ νμ μ΄κ²μ μ νν κ²μ λλ€(λ€μ μ£Όμ μ΄λκ°μ μμ κ²μ λλ€).
λκ΅°κ° κ°λ₯ν μ루μ μ λν μ μ μ¬νμ΄ μμΌλ©΄ μλ €μ£Όμμμ€. λ§€μ° κ°μ¬νκ² μ΅λλ€.
νλ¬κ·ΈμΈμ λ°±κ·ΈλΌμ΄λμμ μμΉμ μ‘μΈμ€νμ§ μμ΅λλ€. λ§μ΄ μμ²ν κΈ°λ₯μ΄μ§λ§ μμ§ κ΅¬ννμ§ λͺ»νμ΅λλ€.
AndroidManifest.xml νμΌμ λμ΄λ
ACCESS_BACKGROUND_LOCATION
κΆνμ΄ μλμ§ νμΈν μ μμ΅λκΉ? κ·Έλ λ€λ©΄ μ κ±°νμμμ€. μ΄ νλ¬κ·ΈμΈμ΄ μλνλ λ° νμνμ§ μμ΅λλ€.
μ΄ κΆνμ μΈμ μΆκ°νλμ§ κΈ°μ΅λμ§ μμ§λ§ μ΄μ μ΄ κΆνμ μμ νκ³ Googleμ μ±μ μ μΆνμ΅λλ€. λ§μ§λ§μΌλ‘ λ°©κΈ Googleμμ λ΄ μ±μ μΉμΈνμ΅λλ€.
Google Play μ½μ μ μΈ μμμμ μ ν리μΌμ΄μ
μ΄ λ°±κ·ΈλΌμ΄λμμ μμΉλ₯Ό μ¬μ©νμ§ μλλ€κ³ μ μΈν΄μΌ ν©λλ€.
μ¬λ¬λΆ, λ°©κΈ Google Playμμ μΉμΈμ λ°μμ΅λλ€.
λΌμ΄λΈλ¬λ¦¬ λ΄λΆμ PermissionManager ν΄λμ€μ "ACCESS_BACKGROUND_LOCATION" κΆνμ΄ λΆλͺ
ν ν¬ν¨λμ΄ μμμ λ°κ²¬νμ΅λλ€.
μ΄μ Googleμ μ μΆν "ACCESS_FINE_LOCATION" λ° "ACCESS_COARSE_LOCATION" κΆνλ§ μ¬μ©νλλ‘ λ°±κ·ΈλΌμ΄λ μμΉ λ° μ΄λ₯Ό λ°νν μ μλ λͺ¨λ 쑰건과 κ΄λ ¨λ λͺ¨λ κ²μ μ κ±°νλ ν΄λμ€λ₯Ό λ‘μ»¬λ‘ μμ νμΌλ©° μΉμΈλμμ΅λλ€.
μ€μ λ‘ μΉμΈμ μν₯μ λ―Έμ³€λμ§ νμΈν μλ μμ§λ§ νμν κ²½μ°
λ°°κ²½ μμΉλ₯Ό μ¬μ©νμ§ μλλ‘ μμ λ ν΄λμ€λ₯Ό λ°λ₯΄μμμ€.
package com.baseflow.geolocator.permission;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.baseflow.geolocator.errors.ErrorCallback;
import com.baseflow.geolocator.errors.ErrorCodes;
import com.baseflow.geolocator.errors.PermissionUndefinedException;
import java.util.*;
import io.flutter.plugin.common.PluginRegistry;
public class PermissionManager
implements PluginRegistry.RequestPermissionsResultListener {
private static final int PERMISSION_REQUEST_CODE = 109;
<strong i="10">@Nullable</strong>
private Activity activity;
<strong i="11">@Nullable</strong>
private ErrorCallback errorCallback;
<strong i="12">@Nullable</strong>
private PermissionResultCallback resultCallback;
public LocationPermission checkPermissionStatus(
Context context,
Activity activity) throws PermissionUndefinedException {
String permission = determineFineOrCoarse(context);
// If target is before Android M, permission is always granted
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return LocationPermission.whileInUse;
}
final int permissionStatus = ContextCompat.checkSelfPermission(context, permission);
if (permissionStatus == PackageManager.PERMISSION_DENIED) {
if (PermissionUtils.isNeverAskAgainSelected(activity, permission)) {
return LocationPermission.deniedForever;
} else {
return LocationPermission.denied;
}
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
return LocationPermission.whileInUse;
}
return LocationPermission.whileInUse;
}
public void requestPermission(
Activity activity,
PermissionResultCallback resultCallback,
ErrorCallback errorCallback)
throws PermissionUndefinedException {
final ArrayList<String> permissionsToRequest = new ArrayList<>();
// Before Android M, requesting permissions was not needed.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return;
}
String permission = determineFineOrCoarse(activity);
permissionsToRequest.add(permission);
this.errorCallback = errorCallback;
this.resultCallback = resultCallback;
this.activity = activity;
ActivityCompat.requestPermissions(
activity,
permissionsToRequest.toArray(new String[0]),
PERMISSION_REQUEST_CODE);
}
<strong i="13">@Override</strong>
public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode != PERMISSION_REQUEST_CODE) {
return false;
}
if (this.activity == null) {
Log.e("Geolocator", "Trying to process permission result without an valid Activity instance");
if (this.errorCallback != null) {
this.errorCallback.onError(ErrorCodes.activityNotSupplied);
}
return false;
}
String requestedPermission;
try {
requestedPermission = determineFineOrCoarse(this.activity);
} catch (PermissionUndefinedException ex) {
if (this.errorCallback != null) {
this.errorCallback.onError(ErrorCodes.permissionDefinitionsNotFound);
}
return false;
}
LocationPermission permission = LocationPermission.denied;
int requestedPermissionIndex = indexOf(permissions, requestedPermission);
if (requestedPermissionIndex < 0) {
Log.w("Geolocator", "Location permissions not part of permissions send to onRequestPermissionsResult method.");
return false;
}
if (grantResults.length == 0) {
Log.i("Geolocator", "The grantResults array is empty. This can happen when the user cancels the permission request");
return false;
}
if (grantResults[requestedPermissionIndex] == PackageManager.PERMISSION_GRANTED) {
permission = LocationPermission.whileInUse;
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !activity.shouldShowRequestPermissionRationale(requestedPermission)) {
permission = LocationPermission.deniedForever;
}
}
for (String perm : permissions) {
PermissionUtils.setRequestedPermission(activity, perm);
}
if (this.resultCallback != null) {
this.resultCallback.onResult(permission);
}
return true;
}
private static <T> int indexOf(T[] arr, T val) {
return Arrays.asList(arr).indexOf(val);
}
private static String determineFineOrCoarse(Context context) throws PermissionUndefinedException {
boolean wantsFineLocation = PermissionUtils.hasPermissionInManifest(context, Manifest.permission.ACCESS_FINE_LOCATION);
boolean wantsCoarseLocation = PermissionUtils.hasPermissionInManifest(context, Manifest.permission.ACCESS_COARSE_LOCATION);
if (!wantsCoarseLocation && !wantsFineLocation) {
throw new PermissionUndefinedException();
}
return wantsFineLocation ? Manifest.permission.ACCESS_FINE_LOCATION : Manifest.permission.ACCESS_COARSE_LOCATION;
}
}
μλ νμΈμ @fbambushi , @marcuslindemannrohden , @eniserkaya ,
λλ μ΄κ²μ λν΄ μ½μμΌλ©° μ£Όμ λ¬Έμ λ μμΉ μ€νΈλ¦Όμ λ€μ λ( Geolocator.getPositionStream()
λ°©λ²μ μ¬μ©νμ¬ μ ν리μΌμ΄μ
μ΄ μΌμ μ€μ§(λ°±κ·ΈλΌμ΄λλ‘ μ€μ )λ λ μ€νΈλ¦Ό(ꡬλ
μ·¨μ).
λν λ²μ 6.0.0 ~ 6.1.1μλ μμΉ μ€νΈλ¦Όμ΄ νμ±νλ μνμμ getCurrentPosition
λ©μλλ₯Ό νΈμΆνλ©΄ μμΉ μ€νΈλ¦Όμ νμ±ν μνλ‘ λ μ μλ λ²κ·Έκ° ν¬ν¨λμ΄ μμ΅λλ€(λ¬Έμ #485 λ° #541 μ°Έμ‘°). μ΄ λ¬Έμ λ λ²μ 6.1.2μμ ν΄κ²°λμμ΅λλ€.
μμ½νμλ©΄:
ACCESS_BACKGROUND_LOCATION
λ₯Ό ν¬ν¨νμ§ μμλμ§ νμΈνμμμ€.μΆκ° μ 보λ λ€μμμ μ°Ύμ μ μμ΅λλ€.
@marcuslindemannrohden μ΄ PermissionManager
ν΄λμ€μμ μ κ±°ν μ½λμ λν μ½κ°μ μΈκΈμ ACCESS_BACKGROUND_LOCATION
κΆνμ΄ AndroidManifest.xml νμΌμ λμ΄λμ΄ μλ κ²½μ°μλ§ μ΄ μ½λμμ λ°±κ·ΈλΌμ΄λ κΆνμ μμ²ν©λλ€. μλ κ²½μ° μμ²λμ§ μμΌλ―λ‘ μ±μ μ ν μν₯μ λ―ΈμΉμ§ μμΌλ©° Googleμμ μ±μ κ±°λΆνλ μ΄μ κ° λμ΄μλ μ λ©λλ€.
PS μ΄κ²μ΄ λμμ΄ λλμ§ μλ €μ£ΌμΈμ. getPositionStream
κΈ°λ₯μ μ¬μ©νμ§ μμ§λ§ μ΄ νλ¬κ·ΈμΈμ μ¬μ©νλ μ¬λ¬ μ±μ λ¬Έμ μμ΄ Google Play μ€ν μ΄μ μ μΆνμ΅λλ€. getLastKnownPosition
λ° getCurrentPosition
κΈ°λ₯λ§ μμΌλ©΄ λ©λλ€. λ°λΌμ μ΄ μ£Όμ μ λν λ€λ₯Έ νΌλλ°±μ λλ¨ν κ°μ¬ν©λλ€.
μ΄μ λν μ λ°μ΄νΈκ° μμ΅λκΉ? μ± μΉμΈμ λ°λ λ° μ΄λ €μμ κ²ͺκ³ μμ΅λλ€.
κ°μ λ΅μ₯ λ°κΈ°:
λ°±κ·ΈλΌμ΄λ μμΉ μ‘μΈμ€κ° μ μΈλμ§ μμμ΅λλ€. μ±μ λ°±κ·ΈλΌμ΄λ μμΉ μ‘μΈμ€λ₯Ό μμ²νλ κΈ°λ₯μ΄ νλ μ΄μ ν¬ν¨λμ΄ μμμ κ°μ§νμ§λ§ μ΄ κΈ°λ₯μ λν κΆν μ μΈ μμμ μ μΆνμ§ μμμ΅λλ€. Play Consoleμ λ‘κ·ΈμΈνμ¬ μ κ³ μλ₯Ό μ μΆνμΈμ.
λλ getCurrentPosition λ§ μ¬μ©νκ³ μμ΅λλ€.
ACCESS_BACKGROUND_LOCATION κΆνμ ν¬ν¨νμ§ μκ³ ACCESS_FINE_LOCATION κΆνλ§ ν¬ν¨ν©λλ€.
μ΅μ λ²μ 6.1.7μ μ¬μ©νκ³ μμ΅λλ€.
μ λ API λ 벨 29λ₯Ό λͺ©νλ‘ νκ³ μμΌλ©° Developers.android μμ μ΄ν΄ν λ°μ λ°λ₯΄λ©΄ 29 μ΄μμλ ν¬κ·ΈλΌμ΄λ μλΉμ€ μ νμ μΆκ°ν΄μΌ ν©λλ€.
@arnerodde365 , μ 곡ν λ¬Έμλ₯Ό μ½μΌλ©΄ <service
μ μΈμ AndroidManifest.xml
νμΌμ μΆκ°νκ³ android:foregroundServiceType
μμ±μ location
:
<!-- Recommended for Android 9 (API level 28) and lower. -->
<!-- Required for Android 10 (API level 29) and higher. -->
<service
android:name="MyNavigationService"
android:foregroundServiceType="location" ... >
<!-- Any inner elements would go here. -->
</service>
<service ...></service>
μ μΈμ <application>
μ μΈμ νμ νλͺ©μΌλ‘ λμ΄λμ΄μΌ ν©λλ€.
μ΄ λ°©λ²μ μλν΄ λ³΄κ³ λ¬Έμ κ° ν΄κ²°λμλμ§ μλ €μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€. κ·Έλ λ€λ©΄ λ¬Έμλ₯Ό μ λ°μ΄νΈνκ³ μ΄κ²μ΄ README.md νμΌμ μΈκΈλμ΄ μλμ§ νμΈν©λλ€.
κ·Έλ μλ €μ€κ²
νμ§λ§ μ λ μ± κ°λ°μ΄ μ²μμ΄λΌ android:name= ""μ 무μμ λ£μ΄μΌ ν μ§ λͺ¨λ₯΄κ² μ΅λλ€
λλ μ΄κ²μ΄ flutter-geolocator ν¨ν€μ§μ μλΉμ€ μ΄λ¦μ΄μ΄μΌ νλ€κ³ μκ°ν©λλ€.
@arnerodde365 μνλ λͺ¨λ κ²μ΄ κ°λ₯ν©λλ€. κ·Έκ²μ μ¬μ©μ μ μ κ°μ΄λ―λ‘ μ’μ μ΄λ¦μ μ§μ νμμμ€ ;)
μ±μ μ¬μ ν ββλμΌν μλ΅μΌλ‘ κ±°λΆλ©λλ€.
λͺ¨λ μ λ°μ΄νΈ? λ΄ μ»΄νμΌ λ° λμ SDK λ²μ μ΄ 29μ΄κ³ AndroidManifest.xml νμΌμ λ°±κ·ΈλΌμ΄λ κΆνμ ν¬ν¨νμ§ μμμΌλ©° μ± λ²λ€ νμκΈ°μμ λ°±κ·ΈλΌμ΄λ μμΉ κΆνμ μμ²νκ³ μμμ μ¬μ ν νμνκ³ μμ΅λλ€.
루νλ₯Ό λ μ§§κ² μ μ§νλ €λ©΄ λ€μμ ν΅ν΄ Android μ± λ²λ€μ λΉλνλ κ²μ΄ μ’μ΅λλ€.
flutter build appbundle
Running Gradle task 'bundleRelease'... 10.1s
β Built build/app/outputs/bundle/release/app-release.aab (132.6MB).
.aab νμΌμ μΆμΆνκ³ app-release/base/manifest/AndroidManifest.xmlμ μ°Ύμ΅λλ€.
μ΄ λ§€λνμ€νΈ νμΌμ μ± μ€ν μ΄μμ ꡬ문 λΆμν΄μΌ ν©λλ€. [...]android.permission.ACCESS_BACKGROUND_LOCATION[...]
μλ ν μ±μ€ν μ΄λ μ νμνμ§ μ μ ν μ€λͺ
μμ΄ κ±°λΆν©λλ€.
μ¬κΈ°μ λ¬Έμ λ μ¬λ¬ νλ¬ν° νλ¬κ·ΈμΈμ΄ Geolocator λλ μμΉ νλ¬κ·ΈμΈκ³Ό κ°μ΄ μ΄ νλͺ©μ μ체μ μΌλ‘ λμ νλ€λ κ²μ λλ€.
λ°λΌμ μ¬κΈ°μμ λ Όμ μ§μ μ νμνμ§ μμ κ²½μ° μ§λ¦¬ μμΉ μ§μ κΈ°μμ λ°±κ·ΈλΌμ΄λ μμΉ κΆν νλͺ©μ μ κ±°νλ λ°©λ²μΌλ‘ λ³κ²½ν΄μΌ ν©λλ€.
@cguentherTUChemnitz μ ν¨κ» μκ°ν΄ μ£Όμ
μ κ°μ¬ν©λλ€. android.permission.ACCESS_BACKGROUND_LOCATION
κ° Geolocator λλ λ€λ₯Έ νλ¬κ·ΈμΈμ μν΄ λ³ν©λ μλ μλ€κ³ μκ°νμ΅λλ€.
λ°λΌμ Geolocator νλ¬κ·ΈμΈκ³Ό κ΄λ ¨λ λͺ¨λ AndroidManifest.xml νμΌμ νμΈνμ§λ§ μ½λ λ² μ΄μ€μμ μΈκΈλ μ΄ νΉμ κΆνμ μ°Ύμ μ μμ΅λλ€.
λ΄μΌ λλ λΉμ μ΄ μΈκΈν .aab νμΌμ λΆμνλ μΆκ° ν μ€νΈλ₯Ό μ€ννκ³ Geolocatorκ° μ΄ νλͺ©μ AndroidManifest.xml νμΌμ λ£λμ§ νμΈνλ €κ³ ν©λλ€.
λ΅λ³μ΄ λ¦μ΄ μ£μ‘ν©λλ€. μ λ²μ μ΄ λμμ΅λλ€.
κΆν μ μΈ μμμμ κ°μΈ μ 보 λ³΄νΈ μ μ±
μ§μΉ¨μ λ°λ₯΄μ§ μμ΅λλ€.
μ΄μ λ²λ€μ 맀λνμ€νΈ νμΌμ ACCESS_BACKGROUND_LOCATION μμ΄ μ΄ νλ¬κ·ΈμΈμ μ¬μ©ν μ μλ€λ κ²λ νμΈν μ μμ΅λλ€. μ κ²½μ°μλ λ€λ₯Έ νλ¬κ·ΈμΈμ΄ λ΄ νλ‘μ νΈμ μ΄ νλ¬κ·ΈμΈμ λμ νμ΅λλ€.
@cguentherTUChemnitz νμΈν΄μ£Όμ μ λλ¨ν κ°μ¬ν©λλ€. μ΄ λ¬Έμ μ μμΈμ΄ λ νλ¬κ·ΈμΈμ 곡μ νμκ² μ΅λκΉ? μ΄κ²μ λ€λ₯Έ μ¬λλ€μκ²λ λμμ΄ λ μ μμ΅λλ€.
@arnerodde365 , κ·Έκ²μ λν΄ κ±±μ νμ§ λ§μμμ€. μ΄ λ¬Έμ λ AndroidManifest.xml νμΌμ ACCESS_BACKGROUND_LOCATION
κΆνμ μλμΌλ‘ λμ
νλ λ€λ₯Έ νλ¬κ·ΈμΈ λλ ν¨ν€μ§λ‘ μΈν΄ λ°μν μ μμ΅λλ€. pubspec.yaml
(λλ dependencies
μΉμ
)μ λ΄μ©μ 곡μ ν μν₯μ΄ μλ€λ©΄ μ’
μμ±μ νμΈνμ¬ λ¬Έμ λ₯Ό μΌμΌν€λ νλ¬κ·ΈμΈμ μ°Ύμ μ μλμ§ νμΈνκ² μ΅λλ€.
μ΄ λ¬Έμ κ° κΈ°λ³Έ Flutter 리ν¬μ§ν 리μμλ μ κΈ°λ κ²μΌλ‘ λνλ¬μ΅λλ€(flutter/flutter#73461 μ°Έμ‘°).
flutter_widget_from_html_core: ^0.4.3
flutter_local_notifications: ^1.4.4+2
flutter_appcenter_bundle: ^3.2.0+1
shared_preferences: ^0.5.6+2
flutter_translate: ^1.6.0
redux_persist: ^0.8.3
flutter_redux: ^0.6.0
url_launcher: ^5.4.10
package_info: ^0.4.0+13
flutter_map: ^0.8.2
geolocator: ^6.1.7
provider: ^4.3.2+2
geojson: ^0.9.1
shimmer: ^1.1.2
toast: ^0.1.5
http: ^0.12.0+4
intl: ^0.16.1
μ¬νκ²λ μ΄ μ 보λ λ€λ₯Έ μ¬λλ€μκ² μ€μ λ‘ λμμ΄ λμ§ μμ΅λλ€. μ κ²½μ°μλ λμΌν νλ‘μ νΈμμ μ¬μ©νλ λΉκ³΅κ° νλ¬κ·ΈμΈμμ μ΄ κΆνμ κ°μ§κ³ μμμ΅λλ€.
κ·Έλ¬λ μ΄μ μ±μ΄ μΆμλμ΄ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€. googleκ³Ό κ·Έλ€μ μ μΈ μμμ λ¬Έμ κ° μλ€κ³ μκ°ν©λλ€. Live λ²μ μ΄ κ°μΈ μ 보 λ³΄νΈ μ μ± μ λ°λ₯΄μ§ μμκΈ° λλ¬Έμ λ² νμμ μ±μ μ»μ μ μμμ΅λλ€ ...
@cguentherTUChemnitz λ° @arnerodde365 μΆκ° νΌλλ°±μ μ κ³΅ν΄ μ£Όμ
μ κ°μ¬ν©λλ€. μ΄μ AndroidManifest.xml νμΌμ ACCESS_BACKGROUND_LOCATION
κΆνμ ν¬ν¨νλ©΄ Play μ€ν μ΄μμ μ±μ κ±°λΆν κ²μμ νμΈν μ μμ΅λλ€.
λν μ΄κ²μ Geolocator νλ¬κ·ΈμΈμ μν΄ μλμΌλ‘ μΆκ°λμ§ μμ§λ§ λ€λ₯Έ νλ¬κ·ΈμΈμ μν΄ μΆκ°λ μ μμμ νμΈν μ μμ΅λλ€(μ: Location νλ¬κ·ΈμΈμ΄ μλμΌλ‘ μΆκ°). ν΄κ²° λ°©λ²μ΄ μ λ§λ‘ νμν μ¬λλ€μ μν΄ λ€μμ AndroidManifest.xmlμ <manifest ...>
νκ·Έμ μ§κ³ μμμΌλ‘ μΆκ°ν μ μμ΅λλ€.
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" tools:node="remove"/>
μ΄λ κ² νλ©΄ λ€λ₯Έ νλ¬κ·ΈμΈμ΄ AndroidManifest.xml νμΌμ μΆκ°νλλΌλ ACCESS_BACKGROUND_LOCATION
κΆνμ΄ μ κ±°λ©λλ€. μ΄κ²μ μ΄ κΆνμ μμ‘΄νλ νλ¬κ·ΈμΈμ λν΄ μκΈ°μΉ μμ λμμ μ λ°ν μ μμ΅λλ€.
μ΄ λ¬Έμ λ Geolocator νλ¬κ·ΈμΈ μμ²΄λ‘ μΈν κ²μ΄ μλλΌκ³ μκ°νκΈ° λλ¬Έμ μ§κΈ μ΄ λ¬Έμ λ₯Ό λ«κ² μ΅λλ€.
blah blah λ³΅μ¬ λΆμ¬λ£κΈ°λ₯Ό ν μ¬λλ€μ μν΄:
The prefix "tools" for attribute "tools:node" associated with an element type "uses-permission" is not bound.
μΆκ°ν΄μΌ ν©λλ€.
xmlns:tools="http://schemas.android.com/tools"
μλ¨μμ λ€μκ³Ό κ°μ΄
```xml
ν¨ν€μ§="com.example.your_app">
````
μ΄ μ루μ μ μΆμ²:
(https://stackoverflow.com/questions/55334431/facing-below-error-toolsnode-associated-with-an-element-type-uses-permission)[https://stackoverflow.com/questions/55334431/facing- under-error-toolsnode-associated-with-an-element-type-uses-permission]
Android νλ«νΌ μμ²΄κ° μ± μ€μΉ μ€μ ACCESS_BACKGROUND_LOCATION
κΆνμ μ£Όμ
νλ―λ‘ μ΄ νλ¬κ·ΈμΈμ κ²°ν¨μ΄ μλ μ μμ΅λλ€. μ΄ λ§ν¬μμ μμΈν λ΄μ©μ μ½μ μ μμ΅λλ€. https://developer.android.com/about/versions/10/privacy/changes#app -access-device-location
μ΄λ€ μν:
μ±μ΄ Android 10 μ΄μμμ μ€νλμ§λ§ Android 9(API λ 벨 28) μ΄νλ₯Ό λμμΌλ‘ νλ κ²½μ° νλ«νΌμ λ€μ λμμ μ μ©ν©λλ€.
μ±μ΄ λ€μμ μ μΈνλ κ²½μ°
μ±μμ ACCESS_FINE_LOCATION λλ ACCESS_COARSE_LOCATIONμ μμ²νλ©΄ μμ€ν
μμ μλμΌλ‘ ACCESS_BACKGROUND_LOCATIONμ μμ²μ μΆκ°ν©λλ€.
μ λ geolocatorμ 곡μ μμ λ₯Ό .apk(μλͺ λ λΉλ)λ‘ λΉλνκ³ νλ μ΄ μ€ν μ΄μ μ λ‘λνμ΅λλ€.
λ¬Έμ κ° μμ΅λλ€.
"λ°±κ·ΈλΌμ΄λ μμΉ κΆν μ μΈμ μ λ°μ΄νΈν΄μΌ ν©λλ€."
AndroidManifest.xmlμ κΉ¨λν©λλ€. κΆνμ΄ μ μΈλμ§ μμμ΅λλ€.
.apk μΈλΆ μ 보(Play μ€ν μ΄ κ΄λ¦¬ νμ΄μ§)μ μμ²λ κΆνμ΄ νμλμ§ μμ΅λλ€.
λ² ν μ±λ(baseflow ν νλ¦Ώμλ ν΄λΉ Dart λ²μ μ΄ νμνκΈ° λλ¬Έ).
[β] Flutter(Linuxμ κ²½μ° μ±λ λ² ν, 1.25.0-8.3.pre, λ‘μΌμΌ en_US.UTF-8)
β’ Flutter λ²μ 1.25.0-8.3.pre(/home/anand/flutter)
β’ νλ μμν¬ κ°μ ν 5d36f2e7f5(11μΌ μ ), 2021-01-14 15:57:49 -0800
β’ μμ§ κ°μ ν 7a8f8ca02c
β’ Dart λ²μ 2.12.0(λΉλ 2.12.0-133.7.beta)
[건λλ°μλ€]
μΆμ
μλ§λ μ΄ λ¬Έμ μΌ μ μμ΅λλ€(ACCESS_BACKGROUND_LOCATION κΆνμ΄ μλ μ΄μ .apk).
https://stackoverflow.com/questions/65789352/google-asks-for-location-permission-declaration-for-new-android-app-release/65849925
PPS μ, μ€λ₯ μμ΄ λ΄λΆ ν μ€νΈμ 곡μ Geolocator μμ λ₯Ό κ²μν μ μμμ΅λλ€. λ€λ₯Έ μ¬μ©μκ° μ΄ μ¬λ‘λ₯Ό μ°Ύμ μ μλλ‘ μ¬κΈ°μμ μ΄ κ²μλ¬Όμ μμ νμ§ μμ΅λλ€. μλ§λ μ μ©ν κ²μ λλ€.
νλ¬κ·ΈμΈ Geolocationμμ λ¬Έμ κ° λ°μνμ§ μλλΌλ ν΄κ²°μ± μ μ°Ύμ μ¬λμ΄ μμ΅λκΉ?
λμΌν μ€λ₯κ° λ°μνμ΅λλ€. μ κ²½ Geolocationλ§ μ¬μ©νκ³ λ§€λνμ€νΈμ ACCESS_BACKGROUND_LOCATION κΆνμ΄ μμ§λ§ Google Playμμ λ΄ μ±μ κ±°λΆν©λλ€.
Background location access not declared
We detected that your app contains at least one feature that requests access to location in the background,
however your permission declaration form did not reflect this.
Please log in to your Play Console to resubmit your location declaration form.
You may either remove location in the background from your app or indicate that the usage is in the background.
λ΅λ³ κ°μ¬ν©λλ€
κ°μ₯ μ μ©ν λκΈ
@cguentherTUChemnitz λ° @arnerodde365 μΆκ° νΌλλ°±μ μ κ³΅ν΄ μ£Όμ μ κ°μ¬ν©λλ€. μ΄μ AndroidManifest.xml νμΌμ
ACCESS_BACKGROUND_LOCATION
κΆνμ ν¬ν¨νλ©΄ Play μ€ν μ΄μμ μ±μ κ±°λΆν κ²μμ νμΈν μ μμ΅λλ€.λν μ΄κ²μ Geolocator νλ¬κ·ΈμΈμ μν΄ μλμΌλ‘ μΆκ°λμ§ μμ§λ§ λ€λ₯Έ νλ¬κ·ΈμΈμ μν΄ μΆκ°λ μ μμμ νμΈν μ μμ΅λλ€(μ: Location νλ¬κ·ΈμΈμ΄ μλμΌλ‘ μΆκ°). ν΄κ²° λ°©λ²μ΄ μ λ§λ‘ νμν μ¬λλ€μ μν΄ λ€μμ AndroidManifest.xmlμ
<manifest ...>
νκ·Έμ μ§κ³ μμμΌλ‘ μΆκ°ν μ μμ΅λλ€.μ΄λ κ² νλ©΄ λ€λ₯Έ νλ¬κ·ΈμΈμ΄ AndroidManifest.xml νμΌμ μΆκ°νλλΌλ
ACCESS_BACKGROUND_LOCATION
κΆνμ΄ μ κ±°λ©λλ€. μ΄κ²μ μ΄ κΆνμ μμ‘΄νλ νλ¬κ·ΈμΈμ λν΄ μκΈ°μΉ μμ λμμ μ λ°ν μ μμ΅λλ€.μ΄ λ¬Έμ λ Geolocator νλ¬κ·ΈμΈ μμ²΄λ‘ μΈν κ²μ΄ μλλΌκ³ μκ°νκΈ° λλ¬Έμ μ§κΈ μ΄ λ¬Έμ λ₯Ό λ«κ² μ΅λλ€.