안드로이드 스튜디오 java.lang.IllegalArgumentException: invalid provider: null

조회수 2233회
package com.example.jun.artest;

import android.Manifest;
import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;

/**
 * Created by Jun on 2017-05-07.
 */

public class MainActivity extends Activity {

    private static final String TAG = "Compass";
    private static boolean DEBUG = true;
    private SensorManager mSensorManager;
    private Sensor mSensor;
    LocationManager locMgr;

    private DrawSurfaceView mDrawView;

    private final SensorEventListener mListener = new SensorEventListener() {
        public void onSensorChanged(SensorEvent event) {
            if (mDrawView != null) {
                mDrawView.setOffset(event.values[0]);
                mDrawView.invalidate();
            }
        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);


        locMgr = (LocationManager) this.getSystemService(LOCATION_SERVICE); // <2>
        locMgr = (LocationManager) this.getSystemService(Service.LOCATION_SERVICE);

        // getting GPS status
        boolean isGPSEnabled = locMgr
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        boolean isNetworkEnabled = locMgr
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        Log.d("OnCreate", LocationUtils.createFineCriteria().toString());
        Log.d("******GPS******", String.valueOf(isGPSEnabled));
        Log.d("******NETWORK*******", String.valueOf(isNetworkEnabled));

        if (ContextCompat.checkSelfPermission
                (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 0);
        } else {
            Log.d("PerMission", "ACCESS_FINE_LOCATION GRANTED******************");
        }

        LocationProvider high = locMgr.getProvider(locMgr.getBestProvider(LocationUtils.createFineCriteria(), true));
        // using high accuracy provider... to listen for updates
        try {
            locMgr.requestLocationUpdates(high.getName(), 0, 0f,
                    new LocationListener() {
                        public void onLocationChanged(Location location) {
                            // do something here to save this new location
                            Log.d(TAG, "Location Changed");
                            mDrawView.setMyLocation(location.getLatitude(), location.getLongitude());
                            mDrawView.invalidate();
                        }

                        public void onStatusChanged(String s, int i, Bundle bundle) {

                        }

                        public void onProviderEnabled(String s) {
                            // try switching to a different provider
                        }

                        public void onProviderDisabled(String s) {
                            // try switching to a different provider
                        }
                    });
        } catch(SecurityException e){

        }
        Log.d("********************", "WOWOWOWWOWOWOW*******************8");
    }

    @Override
    protected void onResume() {
        if (DEBUG)
            Log.d(TAG, "onResume");
        super.onResume();

        mSensorManager.registerListener(mListener, mSensor, SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    protected void onStop() {
        if (DEBUG)
            Log.d(TAG, "onStop");

        mSensorManager.unregisterListener(mListener);
        super.onStop();
    }
}

05-07 21:18:03.818 19859-19859/com.example.jun.artest E/AndroidRuntime: FATAL EXCEPTION: main

                                                                    Process: com.example.jun.artest, PID: 19859
                                                                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.jun.artest/com.example.jun.artest.MainActivity}: java.lang.IllegalArgumentException: invalid provider: null
                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2924)
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985)
                                                                        at android.app.ActivityThread.-wrap14(ActivityThread.java)
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                        at android.os.Looper.loop(Looper.java:154)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6692)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
                                                                     Caused by: java.lang.IllegalArgumentException: invalid provider: null
                                                                        at android.location.LocationManager.checkProvider(LocationManager.java:2248)
                                                                        at android.location.LocationManager.getProvider(LocationManager.java:381)
                                                                        at com.example.jun.artest.MainActivity.onCreate(MainActivity.java:79)
                                                                        at android.app.Activity.performCreate(Activity.java:6912)
                                                                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2877)
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2985) 
                                                                        at android.app.ActivityThread.-wrap14(ActivityThread.java) 
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1635) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                        at android.os.Looper.loop(Looper.java:154) 
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6692) 
                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) 
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 

안드로이드 LocationManager에서 위치를 받아오는 코드입니다.

계속 위와같은 에러가 뜨는데 왜 에러가 뜨는지 모르겟네요..

isGPSEnabled, isNetworkEnabled로 Permission에 문제없다는 것은 확인했는데,,

왜 null argument가 있다는건지 잘 모르겠습니다ㅠㅠ 코드좀봐주세용..

작성한 여러 파일이 있는데, 글이 너무 길어질 것 같아 생략했습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 우선 AndroidManifest.xml에 다음 권한이 추가되어있는지 확인해보시기 바랍니다.

    <manifest ... >
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        ...
        <!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
        <uses-feature android:name="android.hardware.location.gps" />
        ...
    </manifest>
    
    

    ACCESS_FILE_LOCATION은 NETWORK_PROVIDER와 GPS_PROVIDER로부터 위치 정보 업데이트를 받겠다는 것을 의미합니다.

    올려주신 코드 중 locMgr.getBestProvider() 함수에서 null이 리턴됐다는 것은 사용할 수 있는 프로바이더가 존재하지 않는다는 것을 의미합니다. 사용자가 모든 프로바이더를 비활성화 했을 가능성이 있고, 혹은 LocationUtils.createFineCriteria()로 생성된 Criteria가 요구사항에 맞는 객체인지를 확인해 볼필요가 있습니다.

    아래 코드에 의하면 Exception이 발생하는 경우, GPS and wireless networks are disabled된 상태라는 것을 확인할 수 있는데 디바이스의 현재 상태를 확인해보시기 바랍니다.

    어쨌든 이 함수는 null을 반환할 수 있기 때문에 이 부분에 대한 예외처리는 필요합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 해보지 않아서 확실하진 않지만

    검색후 보니 두군데다 api 23 이상으로 설정하지 않아서 그렇다고 하네요

    한번 수정후 다시 해보셔도 될듯합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답변 감사합니다. 두군데 라는게 무슨 뜻인가요..? api25 로 설정하고 했습니다 알 수 없는 사용자 2017.5.8 10:01

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)