Tôi hoàn toàn mới phát triển Android, nhưng trước đây tôi đã làm việc với Java (và các ngôn ngữ lập trình khác).Tại sao các quyền AndroidManifest không được đặt trong ứng dụng của tôi
Tôi đang sử dụng Android Studio để phát triển ứng dụng của mình và tôi đã gặp khó khăn khi làm theo hướng dẫn dành cho nhà phát triển về cách truy cập thông tin Vị trí (http://developer.android.com/training/location/index.html). Tôi hiểu rằng các dịch vụ Vị trí yêu cầu các android.permission.ACCESS_COARSE_LOCATION
và/hoặc android.permission.ACCESS_FINE_LOCATION
quyền nhưng khi thêm chúng vào ApplicationManifest ứng dụng của tôi của tôi vẫn còn bị treo với một SecurityException
java.lang.SecurityException: Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations.
Tôi đã đi qua một số trường hợp khác của người gặp khó khăn, nhưng những nói chung là kết quả của việc đặt sai (java.lang.SecurityException: Requires ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION permission), sai chính tả (ACCESS_FINE_LOCATION AndroidManifest Permissions Not Being Granted) hoặc viết hoa không chính xác của chuỗi quyền.
Đây là ApplicationManifest.xml tôi
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="scd.tt" >
<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.INTERNET" />
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="23" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher_tt_v2"
android:label="@string/app_name"
android:theme="@style/TT_Theme">
<activity
android:name=".MainActivity"
android:theme="@style/TT_Theme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".LoginActivity" android:theme="@style/TT_Theme.NoActionBar" />
<activity android:name=".IndexActivity" />
</application>
</manifest>
Tôi thậm chí đã cố gắng để loại bỏ ACCESS_NETWORK_STATE và INTERNET để xem nếu điều này sẽ gây ra SecurityExceptions khác như các ứng dụng được yêu cầu phải giao tiếp với một máy chủ HTTP (mà nó thực hiện thành công) trước khi nó được cố gắng để có được thông tin vị trí.
Dường như việc sửa đổi tôi thực hiện đối với quyền trên AndroidManifest không được cập nhật khi tôi chạy chương trình. Tôi cũng đã cố gắng làm sạch và xây dựng lại ứng dụng bằng cách sử dụng trình đơn Xây dựng.
CẬP NHẬT:
Đây là cốt lõi của Hoạt động; Tôi đã gỡ bỏ một số phương pháp không liên quan (ví dụ như onCreateOptionsMenu() và onBackPressed() khi họ không có gì để làm với Địa điểm)
package scd.tt;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Location;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import java.util.Map;
/**
* Created by Liam on 08/09/2015
*/
public class IndexActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
private Location mLastLocation;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_index);
if(debug) Log.d(TAG, "onCreate() called: savedInstanceState is " + (savedInstanceState == null ? "null" : "not null"));
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
buildGoogleApiClient();
if (findViewById(R.id.index_fragment_container) != null) {
if (savedInstanceState != null) return;
Fragment index = new IndexFragment();
index.setArguments(getIntent().getExtras());
getFragmentManager().beginTransaction().add(R.id.index_fragment_container, index).commit();
}
}
@Override
protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
protected void onStop() {
super.onStop();
mGoogleApiClient.disconnect();
}
@Override
public void onConnected(Bundle bundle) {
if(debug) Log.d(TAG, "onConnected");
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
startLocationUpdates();
}
@Override
public void onConnectionSuspended(int i) {
if(debug) Log.d(TAG, "Connection Suspended");
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
if(debug) Log.d(TAG, "Connection Failed");
}
@Override
public void onLocationChanged(Location location) {
mLastLocation = location;
}
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
if(debug) Log.d(TAG, "buildGoogleAPIClient()");
}
protected void startLocationUpdates() {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
}
Bạn có đang chạy chương trình này trên trình giả lập không? – Actiwitty
Bạn đã có mã nào trong hoạt động của mình cho đến thời điểm này? – fractalwrench
Có, ứng dụng đang được chạy trong trình giả lập để kiểm tra. Nó dựa trên Nexus 5 trên nền tảng x86 sử dụng phiên bản API/SDK 23. –