Android 无法解析符号 OnRequestPermissionsResultCallback

标签 android xml google-maps android-fragments gps

我是 android 的新手,我正在尝试构建一个应用程序来显示我当前的位置,我正在按照来自谷歌链接的 apidemos 中的设置 here .这是任务的一部分,所以我不想透露我的最终目标是什么。现在我希望能够在我的应用程序上使用 gps 位置。我将发布我的 Activity 代码、xml 布局代码、 list 代码和 gradle 代码。如果还有什么我需要发布的,请告诉我。我试过搜索,但找不到任何东西。另外,如果它有帮助,我主要是为我的手机做这个。连结 6p 安卓 6.0.1

编辑:得到 OnRequestPermissionsResultCallback 工作但仍然有 PermissionUtils 给我一个错误。

我会在我的错误/无法解决的地方发表评论

XML 代码

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/map"
    tools:context=".MapsActivity"
    android:name="com.google.android.gms.maps.SupportMapFragment">

    <Button
        android:id="@+id/StartButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start|bottom"
        android:text="@string/Start"
        android:padding="10dp"
        android:layout_marginBottom="10dp"
        android:paddingLeft="10dp"
        android:onClick="start"/>
    <Button
        android:id="@+id/StopButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start|bottom"
        android:text="@string/Stop"
        android:padding="10dp"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="107dp"
        android:paddingLeft="10dp"
        android:onClick="stop"/>
    <Button
        android:id="@+id/CameraButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:text="@string/Camera"
        android:padding="10dp"
        android:layout_marginBottom="10dp"
        android:layout_marginRight="107dp"
        android:paddingRight="10dp"
        android:onClick="openCamera"/>
    <Button
        android:id="@+id/ShareButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:text="@string/Share"
        android:padding="10dp"
        android:layout_marginBottom="10dp"
        android:paddingRight="10dp"/>

</fragment>

这是我的 Activity

package com.example.name.app;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.app.FragmentActivity;

import android.view.View;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import android.support.v4.content.ContextCompat;
import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener;

import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import android.content.Intent;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.widget.Button;



public class MapsActivity extends AppCompatActivity
        implements
        OnMyLocationButtonClickListener,
        OnMapReadyCallback,
        ActivityCompat.OnRequestPermissionsResultCallback { //ERROR on OnRequest...CallBack
    /**
     * Request code for location permission request.
     *
     * @see #onRequestPermissionsResult(int, String[], int[])
     */
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1;
    /**
     * Flag indicating whether a requested permission has been denied after returning in
     * {@link #onRequestPermissionsResult(int, String[], int[])}.
     */
    private boolean mPermissionDenied = false;

    Button startbutton;
    Button stopbutton;
    Button sharebutton;
    private GoogleMap mMap;
    static final int REQUEST_IMAGE_CAPTURE = 1;
    static final int REQUEST_TAKE_PHOTO = 1;

    String mCurrentPhotoPath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        startbutton= (Button) findViewById(R.id.StartButton);
        stopbutton = (Button) findViewById(R.id.StopButton);
        sharebutton= (Button) findViewById(R.id.ShareButton);

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Venice, Italy, and move the camera.
        /* LatLng venice = new LatLng(45.43, 12.33);
        mMap.addMarker(new MarkerOptions().position(venice).title("Marker in Venice"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(venice));*/

        mMap.setOnMyLocationButtonClickListener(this);
        enableMyLocation();
    }

    private void enableMyLocation() {
        //ERROR CANNOT RESOLVE METHOD checkSelfPermission
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            // Permission to access the location is missing.
            //ERROR CANNOT RESOLVE SYMBOL PermissionUtils
            PermissionUtils.requestPermission(this, LOCATION_PERMISSION_REQUEST_CODE,
                    Manifest.permission.ACCESS_FINE_LOCATION, true);
        } else if (mMap != null) {
            // Access to the location has been granted to the app.
            mMap.setMyLocationEnabled(true);
        }
    }

    @Override
    public boolean onMyLocationButtonClick() {
        Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show();
        // Return false so that we don't consume the event and the default behavior still occurs
        // (the camera animates to the user's current position).
        return false;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) {
            return;
        }
        //ERROR CANNOT RESOLVE SYMBOL PermissionUtils

        if (PermissionUtils.isPermissionGranted(permissions, grantResults,
                Manifest.permission.ACCESS_FINE_LOCATION)) {
            // Enable the my location layer if the permission has been granted.
            enableMyLocation();
        } else {
            // Display the missing permission error dialog when the fragments resume.
            mPermissionDenied = true;
        }
    }
    @Override
    protected void onResumeFragments() {
        super.onResumeFragments();
        if (mPermissionDenied) {
            // Permission was not granted, display error dialog.
            showMissingPermissionError();
            mPermissionDenied = false;
        }
    }
    //ERROR CANNOT RESOLVE SYMBOL PermissionUtils

    private void showMissingPermissionError() {
        PermissionUtils.PermissionDeniedDialog
                .newInstance(true).show(getSupportFragmentManager(), "dialog");
    }

    public void start(View view){
        startbutton.setText("Running");
        stopbutton.setText("Stop");
    }
    public void stop(View view){
        stopbutton.setText("Stopped");
        startbutton.setText("Start");
    }
    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        //Get location and store it
        File storageDir = new File (Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES)+"/MyMap"); //Saves it in Pictures/MyMapp  but can only be viewd from file explorer
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );
        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = "file:" + image.getAbsolutePath();
        return image;
    }
    public void openCamera(View view) {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File

            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(photoFile));
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
                galleryAddPic();
            }
        }
    }
    private void galleryAddPic() {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(mCurrentPhotoPath);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
    }

}

这是我的安卓 list

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.name.app" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <!--
 The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
         Google Maps Android API v2, but are recommended.
    -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CAMERA"> </uses-permission>

    <uses-feature android:name="android.hardware.camera"
        android:required="true" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="@string/google_maps_key" />
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

这是我更新的构建 gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.name.app"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'com.google.android.gms:play-services:8.4.0'
    compile 'com.android.support:support-v13:23.2.0'
}

最佳答案

升级:

  • compileSdkVersion23
  • buildToolsVersion23.0.2
  • com.android.support:appcompat-v7com.android.support:support-v1323.2.0

您缺少的符号来自 appcompat-v7 的 23.x.y 版本;其他更改是为了使主要版本保持同步。

另外,请注意 7.5.0 是一个相当旧的 play-services 版本;我建议将其升级到 8.4.0

并且,请记住,给定 targetSdkVersion 22,您所有的运行时权限都是毫无意义的。

关于Android 无法解析符号 OnRequestPermissionsResultCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35754609/

相关文章:

math - 确定多个点的质心

android - 错误 :Lambda coming from jar file need their interfaces on the classpath to be compiled, 未知接口(interface)是 java.util.function.Function

android - 无法在 Mac 上的 Android Studio 上创建虚拟设备

android - 复选框未显示在 android 布局上

xml - 如何使用 PowerShell 从此 XML 中提取 ErrorCode 和 ErrorDescription?

ios - 在 Swift iOS 中的 Google map 上选择时动画 map 标记

android - Android开发者站点 'Designing for Performance'文档的问题

android - 未通知 SQLiteCursors,aidl 文件不存在

xml - 如何在遍历节点集时引用源 XML?

android - 谷歌地图中从源到目的地的路径可见性