java.lang.RuntimeException:未能传递结果ResultInfo{who=@android:requestPermissions:,request=10,result=-1,data=Intent

java.lang.RuntimeException:未能传递结果ResultInfo{who=@android:requestPermissions:,request=10,result=-1,data=Intent,android,nullpointerexception,android-permissions,Android,Nullpointerexception,Android Permissions,编辑: 现在应用程序正在运行。但它只在第一次启动(安装后)后才请求权限。如果我离开应用程序(按“上一步”按钮),然后再次启动,它不会请求权限。为什么会发生这种情况 按下“上一步”按钮不是会通过调用onDestroy()破坏活动吗?它不应该再次调用onCreate()方法吗 原始问题 “我的应用”允许用户按按钮查找其当前位置。每当应用首次启动时,它都会请求用户权限,但授予权限后会崩溃,出现以下错误: java.lang.RuntimeException: Failure delivering re

编辑

现在应用程序正在运行。但它只在第一次启动(安装后)后才请求权限。如果我离开应用程序(按“上一步”按钮),然后再次启动,它不会请求权限。为什么会发生这种情况

按下“上一步”按钮不是会通过调用onDestroy()破坏活动吗?它不应该再次调用onCreate()方法吗

原始问题

“我的应用”允许用户按按钮查找其当前位置。每当应用首次启动时,它都会请求用户权限,但授予权限后会崩溃,出现以下错误:

java.lang.RuntimeException: Failure delivering result 
ResultInfo{who=@android:requestPermissions:, request=10, result=-1,
data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has
extras) }} to activity
{com.example.hpi5.location/com.example.hpi5.location.MainActivity}:
java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.widget.Button.setOnClickListener(android.view.View$OnClickListener)'
on a null object reference
以下是我的活动代码:

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.content.pm.PackageManager;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button button ;
    LocationListener locationListener;
    LocationManager locationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        if (Build.VERSION.SDK_INT >=23 ){
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        10);
                return;
            }
        }

        button = (Button) findViewById(R.id.button);

        locationManager = (LocationManager)
                getSystemService(LOCATION_SERVICE);

        locationListener = new LocationListener()
        {

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onProviderEnabled(String provider) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onProviderDisabled(String provider) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onLocationChanged(Location location) {
                // TODO Auto-generated method stub
                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                //double speed = location.getSpeed(); //spe2d in meter/minute
                //speed = (speed*3600)/1000;      // speed in km/minute
                Toast.makeText(getApplicationContext(), "lat" + latitude + "lon" + longitude,Toast.LENGTH_SHORT).show();
            }
        };




    }
    void requestUpdate(){
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
            }
        });

    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String permissions[], @ NonNull int[] grantResults) {
        switch (requestCode) {
            case -1:{
                //hello
            }

            case 10: {
                if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    requestUpdate();
                }
            }

        }
    }



}
以下是logcat错误:

java.lang.RuntimeException: Failure delivering result
ResultInfo{who=@android:requestPermissions:, request=10, result=-1,
data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has
extras) }} to activity
{com.example.hpi5.location/com.example.hpi5.location.MainActivity}:
java.lang.NullPointerException: Attempt to invoke virtual method 'void
    android.widget.Button.setOnClickListener(android.view.View$OnClickListener)'
     on a null object reference
                                                                             at android.app.ActivityThread.deliverResults(ActivityThread.java:3699)
                                                                           at
    android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
                                                                            at android.app.ActivityThread.-wrap16(ActivityThread.java)
     android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                         at android.os.Looper.loop(Looper.java:148)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                         Caused by: java.lang.NullPointerException: Attempt to invoke virtual
     method 'void
  android.widget.Button.setOnClickListener(android.view.View$OnClickListener)'
     on a null object reference
com.example.hpi5.location.MainActivity.requestUpdate(MainActivity.java:80)
     com.example.hpi5.location.MainActivity.onRequestPermissionsResult(MainActivity.java:95)
    android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6553)
                                                                         at android.app.Activity.dispatchActivityResult(Activity.java:6432)
                                                                        at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
 android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) 
                                                                        at android.app.ActivityThread.-wrap16(ActivityThread.java) 
 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:148) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                          at java.lang.reflect.Method.invoke(Native Method) 
     com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

您在初始化
按钮之前请求权限,我假设回调在有机会完全初始化按钮对象之前完成。请尝试将权限检查移动到
onCreate
的末尾,否则,请再次检查按钮的ID是否正确。

编辑了
粗略权限,但tton init.
onCreate()
并在添加了
onRequestPermissionsResult()
后中断

正如错误所说,是由按钮的空对象引起的
NullPointException

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.content.pm.PackageManager;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

Button button ;
LocationListener locationListener;
LocationManager locationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button = (Button) findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {
            requestUpdate();
        }
    });

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission
                        (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,},
                    10);
            return;
        }
    }

    locationManager = (LocationManager)
            getSystemService(LOCATION_SERVICE);

    locationListener = new LocationListener()
    {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
            //double speed = location.getSpeed(); //spe2d in meter/minute
            //speed = (speed*3600)/1000;      // speed in km/minute
            Toast.makeText(getApplicationContext(), "lat" + latitude + "lon" + longitude,Toast.LENGTH_SHORT).show();
        }
    };
}

void requestUpdate(){    
  locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String permissions[], @ NonNull int[] grantResults) {

    switch (requestCode) {
        case -1:
            //hello
            break;


        case 10: 
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                requestUpdate();
            }else{
            //do something if permission not granted.
            }
            break;

    }
 }
}
移动线

 button = (Button) findViewById(R.id.button);
到达之后的位置

setContentView(..);

这是因为它在您的布局中找不到R.id.button。我修复了您的代码,请参阅我的答案。@rayanThank谢谢您的帮助:)确定我们也在这里仅提供帮助该应用程序仅在首次安装后请求权限,然后如果退出该应用程序(按“后退”按钮)这是因为按下后退按钮只会破坏活动,而不是应用程序和应用程序进程仍然在内存中。所以如果我(或操作系统)终止进程后,它将再次请求权限。如果请求权限并按下返回键,活动将从oncraete转到onpause,然后返回onresume。如果你终止应用程序并返回,它将再次请求。因此,最好主要在
onCreate、onresume、onpause
上检查活动的每个状态的权限。因此,请做一个简单的检查l函数检查权限,并将此函数设置为我提到的活动状态。按back按钮调用onDestroy()方法(当然也会调用onPause()和onStop()),不是吗?