2016-04-05 36 views
1

Sinyali uygulamaya çalışıyorum, ancak etkinlik çöküyor. Retrofit ve Picasso kullanıyorum. Sinch'i onlarla kullanabilir miyim? Ayrıca, sinch eğitiminde verilen diğer iki sınıfı da kullandım. İşteSinch (OTP doğrulama) etkinliği kilitleniyor

MainActivity.java

public class Register extends AppCompatActivity { 
public static final String SMS = "sms"; 
public static final String FLASHCALL = "flashcall"; 
public static final String INTENT_PHONENUMBER = "phonenumber"; 
public static final String INTENT_METHOD = "method"; 

private EditText mPhoneNumber; 
private Button mSmsButton; 
private Button mFlashCallButton; 
private String mCountryIso; 
private TextWatcher mNumberTextWatcher; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    mPhoneNumber = (EditText) findViewById(R.id.phoneNumber); 
    mSmsButton = (Button) findViewById(R.id.smsVerificationButton); 
    mFlashCallButton = (Button) findViewById(R.id.callVerificationButton); 

    mCountryIso = PhoneNumberUtils.getDefaultCountryIso(this); 
    final String defaultCountryName = new Locale("", mCountryIso).getDisplayName(); 
    final CountrySpinner spinner = (CountrySpinner) findViewById(R.id.spinner); 
    spinner.init(defaultCountryName); 
    spinner.addCountryIsoSelectedListener(new CountrySpinner.CountryIsoSelectedListener() { 
     @Override 
     public void onCountryIsoSelected(String selectedIso) { 
      if (selectedIso != null) { 
       mCountryIso = selectedIso; 
       resetNumberTextWatcher(mCountryIso); 
       // force update: 
       mNumberTextWatcher.afterTextChanged(mPhoneNumber.getText()); 
      } 
     } 
    }); 
    resetNumberTextWatcher(mCountryIso); 

    tryAndPrefillPhoneNumber(); 
} 

private void tryAndPrefillPhoneNumber() { 
    if (checkCallingOrSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { 
     TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
     mPhoneNumber.setText(manager.getLine1Number()); 
    } else { 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 0); 
    } 
} 

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     tryAndPrefillPhoneNumber(); 
    } else { 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) { 
      Toast.makeText(this, "This application needs permission to read your phone number to automatically " 
        + "pre-fill it", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

private void openActivity(String phoneNumber, String method) { 
    Intent verification = new Intent(this, VerificationActivity.class); 
    verification.putExtra(INTENT_PHONENUMBER, phoneNumber); 
    verification.putExtra(INTENT_METHOD, method); 
    startActivity(verification); 
} 

private void setButtonsEnabled(boolean enabled) { 
    mSmsButton.setEnabled(enabled); 
    mFlashCallButton.setEnabled(enabled); 
} 

public void onButtonClicked(View view) { 
    if (view == mSmsButton) { 
     openActivity(getE164Number(), SMS); 
    } else if (view == mFlashCallButton) { 
     openActivity(getE164Number(), FLASHCALL); 
    } 
} 

private void resetNumberTextWatcher(String countryIso) { 

    if (mNumberTextWatcher != null) { 
     mPhoneNumber.removeTextChangedListener(mNumberTextWatcher); 
    } 

    mNumberTextWatcher = new PhoneNumberFormattingTextWatcher(countryIso) { 
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      super.onTextChanged(s, start, before, count); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      super.beforeTextChanged(s, start, count, after); 
     } 

     @Override 
     public synchronized void afterTextChanged(Editable s) { 
      super.afterTextChanged(s); 
      if (isPossiblePhoneNumber()) { 
       setButtonsEnabled(true); 
       mPhoneNumber.setTextColor(Color.BLACK); 
      } else { 
       setButtonsEnabled(false); 
       mPhoneNumber.setTextColor(Color.RED); 
      } 
     } 
    }; 

    mPhoneNumber.addTextChangedListener(mNumberTextWatcher); 
} 

private boolean isPossiblePhoneNumber() { 
    return PhoneNumberUtils.isPossibleNumber(mPhoneNumber.getText().toString(), mCountryIso); 
} 

private String getE164Number() { 
    return PhoneNumberUtils.formatNumberToE164(mPhoneNumber.getText().toString(), mCountryIso); 
} 

}

activity_main.xml benim kodudur

<RelativeLayout 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:background="@drawable/startbg" 
android:padding="0dip" 
tools:context=".MainActivity"> 

<LinearLayout 
    android:id="@+id/numberInputLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:orientation="vertical" 
    android:paddingLeft="40dp" 
    android:paddingRight="40dp"> 

    <com.sinch.verification.sample.CountrySpinner 
     android:id="@+id/spinner" 
     android:layout_width="255dp" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" /> 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginTop="40dp" 
     android:text="@string/enterphonenumber" 
     android:textAllCaps="true" 
     android:textColor="@color/sinch_purple" 
     android:textSize="18sp" /> 

    <EditText 
     android:id="@+id/phoneNumber" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="8dp" 
     android:background="@drawable/inputbox" 
     android:inputType="phone" 
     android:padding="10dp" 
     android:textColor="@color/sinch_purple" 
     android:textSize="32sp"> 

     <requestFocus /> 
    </EditText> 
</LinearLayout> 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:orientation="vertical" 
    android:paddingEnd="40dp" 
    android:paddingStart="40dp"> 

    <Button 
     android:id="@+id/smsVerificationButton" 
     android:layout_width="fill_parent" 
     android:layout_height="60dp" 
     android:layout_centerHorizontal="true" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginBottom="10dp" 
     android:background="@drawable/button_purple_generic" 
     android:minHeight="56dp" 
     android:minWidth="132dp" 
     android:onClick="onButtonClicked" 
     android:text="SMS Verification" 
     android:textAllCaps="true" 
     android:textColor="#ffffff" 
     android:textSize="20sp" /> 

    <Button 
     android:id="@+id/callVerificationButton" 
     android:layout_width="fill_parent" 
     android:layout_height="60dp" 
     android:layout_centerHorizontal="true" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginBottom="30dp" 
     android:background="@drawable/button_purple_generic" 
     android:minHeight="56dp" 
     android:minWidth="132dp" 
     android:onClick="onButtonClicked" 
     android:text="Flash call Verification" 
     android:textAllCaps="true" 
     android:textColor="#ffffff" 
     android:textSize="20sp" /> 


</LinearLayout> 

<TextView 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/numberInputLayout" 
    android:layout_centerHorizontal="true" 
    android:layout_gravity="center_horizontal" 
    android:text="@string/selectcountry" 
    android:textAllCaps="true" 
    android:textColor="@color/sinch_purple" 
    android:textSize="18sp" /> 

CountrySpinner

public class CountrySpinner extends Spinner { 
private Map<String, String> mCountries = new TreeMap<String, String>(); 
private List<CountryIsoSelectedListener> mListeners = new ArrayList<CountryIsoSelectedListener>(); 

public interface CountryIsoSelectedListener { 
    void onCountryIsoSelected(String iso); 
} 

public CountrySpinner(Context context) { 
    super(context); 
} 

public CountrySpinner(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public void init(String defaultCountry) { 
    initCountries(); 
    List<String> countryList = new ArrayList<String>(); 

    countryList.addAll(mCountries.keySet()); 
    countryList.remove(defaultCountry); 
    countryList.add(0, defaultCountry); 

    ArrayAdapter adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, countryList); 

    setAdapter(adapter); 

    setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) { 
      final String selectedCountry = (String) adapterView.getItemAtPosition(position); 
      notifyListeners(selectedCountry); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> adapterView) { 
     } 
    }); 
} 

public void addCountryIsoSelectedListener(CountryIsoSelectedListener listener) { 
    mListeners.add(listener); 
} 

public void removeCountryIsoSelectedListener(CountryIsoSelectedListener listener) { 
    mListeners.remove(listener); 
} 

private void initCountries() { 
    String[] isoCountryCodes = Locale.getISOCountries(); 
    for (String iso : isoCountryCodes) { 
     String country = new Locale("", iso).getDisplayCountry(); 
     mCountries.put(country, iso); 
    } 
} 

private void notifyListeners(String selectedCountry) { 
    final String selectedIso = mCountries.get(selectedCountry); 
    for (CountryIsoSelectedListener listener : mListeners) { 
     listener.onCountryIsoSelected(selectedIso); 
    } 
} 

}

Logcat ben yanlış yapıyorum

7305-7305/earn.free.cashback.snapcash E/AndroidRuntime: FATAL EXCEPTION:main 
                     Process: earn.free.cashback.snapcash, PID: 7305 
                     java.lang.RuntimeException: Unable to start activity ComponentInfo{earn.free.cashback.snapcash/earn.free.cashback.snapcash.Register}: java.lang.NullPointerException: Attempt to invoke virtual method 'void earn.free.cashback.snapcash.CountrySpinner.init(java.lang.String)' on a null object reference 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5443) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void earn.free.cashback.snapcash.CountrySpinner.init(java.lang.String)' on a null object reference 
                      at earn.free.cashback.snapcash.Register.onCreate(Register.java:49) 
                      at android.app.Activity.performCreate(Activity.java:6245) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)  
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)  
                      at android.os.Handler.dispatchMessage(Handler.java:102)  
                      at android.os.Looper.loop(Looper.java:148)  
                      at android.app.ActivityThread.main(ActivityThread.java:5443)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  

?

+0

Bunun bir kopya olarak işaretlenmiş olması gerektiğini düşünmüyorum. Eski soru, NPE'nin genel durumunu ele almayı amaçlamaktaydı; oysa, Op, muhtemelen bir NPE'nin ne olduğunun farkındadır, ancak bu nesnenin neden ilk etapta yaratılmamış olduğunu merak etmektedir. Cevap Android'e özgü olacak. –

+0

@AmokraneChentir'in dediği gibi, bu yinelenen bir soru değil, bence. –

cevap

1

Görüntü zaten oluşturulmadığında, onCreate() numaralı iğneden başlatıcıyı başlatmaya çalışıyorsunuz. onStart() veya onResume()'da yapmayı deneyin.

+0

Çalışmıyor, çalışmıyor. Aslında örnek projeyi indirip çalıştırdığımda iyi çalışıyor. Ama onu projeme entegre ettiğimde çöküyor; Zaten Facebook, Picasso ve güçlendirmeyi entegre ettim. Bazı sorunlara neden oluyorlar mı? Hepsi aynı projede kullanabilir miyim? Ayrıca basamakları denedim ve çalışmayan da. –

+0

CountrySpinner sınıfını mı uyguladınız yoksa bir kütüphane sınıfı mı yaptınız? –

+0

sınıfı, kütüphane sınıfı olarak değil –