2013-10-10 2 views
-1

아래 업데이트 :활동 구성 요소를 인스턴스화 할 수 없습니다. RunTimeException

버튼을 클릭하면이지도 활동이 시작되었습니다. 나는 아래 logcat을받습니다. 매니페스트에 활동이 추가되었습니다. onContent 안에 setContentView가 있습니다. 또한 매니페스트에 선언 된 사용 권한이 있습니다. 레이아웃 XML은지도 조각입니다. 누구나이 문제의 원인이 될만한 것을 보았습니까?

로그 캣 :

10-09 23:16:10.516: W/dalvikvm(27281): threadid=1: thread exiting with uncaught exception (group=0x41955700) 
10-09 23:16:10.516: E/AndroidRuntime(27281): FATAL EXCEPTION: main 
10-09 23:16:10.516: E/AndroidRuntime(27281): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.indeeditis/com.indeeditis.FinderActivity}: java.lang.NullPointerException 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.os.Looper.loop(Looper.java:137) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at java.lang.reflect.Method.invokeNative(Native Method) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at java.lang.reflect.Method.invoke(Method.java:525) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at dalvik.system.NativeStart.main(Native Method) 
10-09 23:16:10.516: E/AndroidRuntime(27281): Caused by: java.lang.NullPointerException 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.location.GeocoderParams.<init>(GeocoderParams.java:50) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.location.Geocoder.<init>(Geocoder.java:83) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.location.Geocoder.<init>(Geocoder.java:95) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at com.indeeditis.FinderActivity.<init>(FinderActivity.java:63) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at java.lang.Class.newInstanceImpl(Native Method) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at java.lang.Class.newInstance(Class.java:1130) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.app.Instrumentation.newActivity(Instrumentation.java:1061) 
10-09 23:16:10.516: E/AndroidRuntime(27281): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128) 
10-09 23:16:10.516: E/AndroidRuntime(27281): ... 11 more 

활동 :

public class FinderActivity extends Activity implements LocationListener { 

GoogleMap mMap; 
Location myLocation; 
EditText length; 
String lengthString; 
LocationManager locationmanager; 
double lati; 
double longi; 
String nameFirst1; 

    List<Address> address; 
    Geocoder coder = new Geocoder(this); 
private static final String TAG_ID = "id"; 
private static final String TAG_FIRSTNAME = "nameFirst"; 
private static final String TAG_LASTNAME = "nameLast"; 
private static final String TAG_EMAIL = "emailAddress"; 
private static final String TAG_ADDRESS = "streetAddress"; 
private static final String TAG_STATE = "state"; 
private static final String TAG_ZIPCODE ="zipCode"; 
private static final String TAG_COMPANY ="company"; 
private static final String TAG_OTHERCOMPANY ="companyTwo"; 

private static final String TAG_PHONE = "phone"; 
JSONArray contacts = null; 

private static class LocationData { 
    private double lat; 
    private double longitude; 
    private String name; 
    private String other; 

    public LocationData(double lat, double longitude, String name, String other) { 
     this.lat = lat; 
     this.longitude = longitude; 
     this.name = name; 
     this.other = other; 
    } 

    public void setLat(double lat) { 
     this.lat = lat; 
    } 
    public void setLongitude(double longitude) { 
     this.longitude = longitude; 
    } 
    public double getLat() { 
     return lat; 
    } 
    public double getLongitude() { 
     return longitude; 
    } 
    public void setName(String name) { 
      this.name = name; 
     } 
     public String getName() { 
     return name; 
     } 
     public String getOther() { 
     return other; 
      } 
    } 

@SuppressLint("NewApi") 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.maps); 
    mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
    if (mMap!= null) { 

     mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
     mMap.setMyLocationEnabled(true); 
     mMap.animateCamera(CameraUpdateFactory.zoomBy(17)); 

     } 

    LocationManager locationmanager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    Criteria cr = new Criteria(); 
    String provider = locationmanager.getBestProvider(cr, true); 
    Location location = locationmanager.getLastKnownLocation(provider); 
    locationmanager.requestLocationUpdates(provider, 20, 0, (LocationListener) this); 

    mMap.moveCamera(CameraUpdateFactory.newLatLng((new LatLng(location.getLatitude(), location.getLongitude())))); 

    new EndpointsTask().execute(FinderActivity.this); 

} 

public class EndpointsTask extends AsyncTask<Context, LocationData, Long> { 

    private List<LocationData> locationList = new ArrayList<LocationData>(); 

    public Long doInBackground(Context... contexts) { 

     Contactinfoendpoint.Builder endpointBuilder = new Contactinfoendpoint.Builder(
      AndroidHttp.newCompatibleTransport(), 
      new JacksonFactory(), 
      new HttpRequestInitializer() { 
      public void initialize(HttpRequest httpRequest) { } 
      }); 
    Contactinfoendpoint endpoint = CloudEndpointUtils.updateBuilder(
    endpointBuilder).build(); 

    try { 

    String apples = endpoint.listContactInfo().execute().toString(); 

    JSONObject jObject = new JSONObject(apples); 

    JSONArray jsonArr = jObject.getJSONArray("items"); 

    for(int i =0 ; i<jsonArr.length() ;i++){ 
     JSONObject jsonObj1 = jsonArr.getJSONObject(i); 


        // Storing each json item in variable 
        String id = jsonObj1.getString(TAG_ID); 
        String nameFirst1 = jsonObj1.getString(TAG_FIRSTNAME); 
        String nameLast1 = jsonObj1.getString(TAG_LASTNAME); 
        String emailAddress1 = jsonObj1.getString(TAG_EMAIL); 
        String streetAddress1 = jsonObj1.getString(TAG_ADDRESS); 
        String state1 = jsonObj1.getString(TAG_STATE); 
        String zip1 = jsonObj1.getString(TAG_ZIPCODE); 
        String phone1 = jsonObj1.getString(TAG_PHONE); 
        String company1 = jsonObj1.getString(TAG_COMPANY); 
        // String othercompany1 = jsonObj1.getString(TAG_OTHERCOMPANY); 
        String othercompany1 = String.valueOf(jsonObj1.optString(TAG_OTHERCOMPANY)); 

        //test to see if made it to string 
        Log.d("YOUR_TAG", "First Name: " + nameFirst1 + " Last Name: " + nameLast1); 

        Log.d("nlltag", apples); 

        String whereDeyAt = streetAddress1 + " " + zip1; 

         address = coder.getFromLocationName(whereDeyAt,5); 

         Address location1 = address.get(0); 

         // SET LAT LNG VALUES FOR MARKER POINT 

        double lati = location1.getLatitude(); 
         double longi = location1.getLongitude(); 

         String otherinfo; 
         if (othercompany1==null) { otherinfo = company1 + ", " + " " + phone1; 
         } 
         else {otherinfo = company1 + ", "+ othercompany1 + " " + phone1; } 

         Log.d("Location", "Location:" + lati + " " + longi); 
         LocationData data = new LocationData(lati, longi, nameFirst1 + " " + nameLast1,otherinfo); 

         locationList.add(data); 
         publishProgress(data); 

    } 

    } catch (IOException e) { 
    e.printStackTrace(); 
    } catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
     return (long) 0; 

    } 

    public LocationData onProgressUpdate(LocationData data) { 


     return data; 
    } 

    protected void onPostExecute(Long result) { 
     for(LocationData data : locationList){ 
      mMap.addMarker(new MarkerOptions() 
      .position(new LatLng(data.getLat(), data.getLongitude())) 
      .title(data.getName()) 
      .snippet(data.getOther())); 
     } 

    } 

    } 

매니페스트 :

<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.indeeditis"> 

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18"/> 

<uses-permission android:name="android.permission.INTERNET"/> 
<permission android:name="com.indeeditis.permission.C2D_MESSAGE" android:protectionLevel="signature"/> 

<uses-permission android:name="com.indeeditis.permission.C2D_MESSAGE"/> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.GET_ACCOUNTS"/> 
<uses-permission android:name="android.permission.USE_CREDENTIALS"/> 

<permission 
    android:name="com.indeeditis.MAPS_RECEIVE" 
    android:protectionLevel="signature"/> 

<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"/> 

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

<uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true"/> 

<!-- for card.io card scanning --> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 

<!-- for most things, including card.io and paypal --> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 


<!-- Camera features --> 
<uses-feature android:name="android.hardware.camera" android:required="false" /> 
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> 
<uses-feature android:name="android.hardware.camera.flash" android:required="false" /> 

<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> 

    <activity android:name="StartScreen"><intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

    </activity> 

    <activity android:label="@string/app_name" android:name=".MainActivity"> 
     </activity> 
    <!-- 
    <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE"/> 
      <category android:name="com.indeeditis"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> 
      <category android:name="com.indeeditis"/> 
     </intent-filter> 
    </receiver> 

    --> 


    <activity android:label="@string/app_name" android:name=".FinderActivity"> </activity> 

    <service android:name="com.paypal.android.sdk.payments.PayPalService" android:exported="false"/> 

    <!-- paypal stuff --> 

<activity android:name="com.paypal.android.sdk.payments.PaymentActivity" /> 
<activity android:name="com.paypal.android.sdk.payments.LoginActivity" /> 
<activity android:name="com.paypal.android.sdk.payments.PaymentMethodActivity" /> 
<activity android:name="com.paypal.android.sdk.payments.PaymentConfirmActivity" /> 
<activity android:name="com.paypal.android.sdk.payments.PaymentCompletedActivity" /> 

<activity 
android:name="io.card.payment.CardIOActivity" 
android:configChanges="keyboardHidden|orientation" /> 
<activity android:name="io.card.payment.DataEntryActivity" /> 

<activity android:name="Maps"></activity> 

<meta-data 
android:name="com.google.android.maps.v2.API_KEY" 
android:value="AIzaSyBqLKpJk50JUSkm_LYO_p079oqUr3qwert"/> 

</application> 

</manifest> 

** * ** * ***UPDATE* ** * ** * ** * ** * *

@ JonSkeet에 따라 변경했습니다. 지오 코더 코더 = 새로운 지오 코더 (this);

to 지오 코더 코더 = 새로운 지오 코더 (getApplicationContext());

로그 캣은 이제 읽

10-15 22:45:50.895: E/AndroidRuntime(2798): FATAL EXCEPTION: main 
10-15 22:45:50.895: E/AndroidRuntime(2798): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.indeeditis/com.indeeditis.FinderActivity}: java.lang.NullPointerException 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at android.os.Looper.loop(Looper.java:137) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at java.lang.reflect.Method.invoke(Method.java:525) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at dalvik.system.NativeStart.main(Native Method) 
10-15 22:45:50.895: E/AndroidRuntime(2798): Caused by: java.lang.NullPointerException 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at com.indeeditis.FinderActivity.<init>(FinderActivity.java:65) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at java.lang.Class.newInstanceImpl(Native Method) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at java.lang.Class.newInstance(Class.java:1130) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at android.app.Instrumentation.newActivity(Instrumentation.java:1061) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128) 
10-15 22:45:50.895: E/AndroidRuntime(2798):  ... 11 more 

나는 여전히 nullpointer을 받고 있지만하지 지오 코더 지금하고 있습니다.

+0

'FinderActivity'의 줄 63은 무엇입니까? – Emmanuel

+0

@Emmanuel 목록

주소; – johnsonjp34

+0

클래스'Address'는 어디에 있습니까? 동일한 활동 파일 또는 이에 대한 또 다른 Java 파일을 만들었습니까? –

답변

1

글쎄 문제을 해결할 수 있지만 즐거운 해결책은 아닙니다.

귀하의 활동은 간접적으로 서브 클래스 ContextWrapper이며, 이는 getPackageName입니다. Geocoder은 주어진 컨텍스트 (사용자의 경우 this)를 사용하여 GeocoderParams을 만들고 해당 컨텍스트에 패키지 이름을 묻습니다.

불행히도 ContextWrapper.getPackageName은 포장하는 문맥에 getPackageName을 호출하여 구현됩니다. 귀하의 경우에는 null입니다. 내가 알 수있는 한, 그 이유는 당신이 NullPointerException을 얻는 이유입니다.

일 수 있으며 자신의 활동 내에서 getPackageName을 무시하십시오. 그 특별한 예외가 제거되지만 추한 솔루션처럼 느껴집니다. 이것은 항상이 접근법을 사용하여 문제가되는 것처럼 보입니다 - 자습서에서 권장되는 접근입니까?

Geocoder coder = new Geocoder(this); 

에 : 다른 샘플 코드를 보면

, 난 그냥이 변경할 수 있습니다 생각

private final Geocoder coder = new Geocoder(getApplicationContext()); 

합니다 (private final 부분은 좋은 습관의 문제입니다, 그리고 여기에 수정 프로그램의 일부가 아닙니다.)

편집 : 같은 이유로 getApplicationContext()이 실패한 것 같습니다. 응용 프로그램이 시작된 후에 만 ​​컨텍스트 관련 정보를 사용할 수 있습니다 (Android 개발자가 아닙니다).

private Geocoder coder; 

@Override public void onStart() { 
    coder = new Geocoder(this); 
} 

기본적으로, 당신은 당신이 제대로 초기화 문맥을 야해 Geocoder를 만들 수 있습니다 - 그래서 조사 할 일이 : 당신이 대신 사용할 수도 있습니다.

+0

고마워요. 필자가 언급 한 것처럼 지오 코더를 변경했지만 이번에는 지오 코더는 언급하지 않지만 여전히 널 포인터를 얻고 있습니다. 나는 맨 아래에 logcat 게시했습니다. 고마워요 – johnsonjp34

+0

@ coconuts4eva : 좋아요, 그래서 그것은 심지어 응용 프로그램 컨텍스트를 가져올 수없는 것 같습니다. (스택 트레이스를 보면, 이것을 읽을 수 있어야합니다.) 활동이 시작될 때만 이것을 초기화해야 할 가능성이 있습니다 - 더 많은 컨텍스트가있을 수 있습니다. –

-1

패키지 이름이 의심스러운 것으로 보입니다. com.indeeditis/com.indeeditis.FinderActivity. 패키지 이름에는 슬래시를 사용할 수 없습니다. AndroidManifest.xml을 다시 확인하십시오.

+0

아무 문제가 없습니다. 나는 그것이 로그캣이 쓰는 방법, 패키지베이스와 전체 패키지 + 활동이라고 생각한다. – johnsonjp34

+0

이것은 ComponentName이라고 불리며 완벽합니다. – JoxTraex

+0

죄송합니다, 제 실수 – Egis

관련 문제