2017-01-03 20 views
0

@アップデート 私は新しいプロジェクトをすべてうまく作成します。しかし、私は何が間違っているのか分からない。私はログインするために電子メールですべての名前をリファクタリングし、テキストビューの電子メールのタイプを通常に変更します。基本的なログインアクティビティのEGL_BAD_MATCH


私は単純なアプリに問題があります。私はデフォルトの読み込みアクティビティを作成しました。そして、ログインするように電子メールを変更してください。ログインとパスワードがあります。

しかし、アプリは端末で停止します。エラーEGL_BAD_MATCH

Androidのモニタエラー

01-03 18:43:35.591 4738-4757/com.example.rachel.safemessenger E/EGL_emulation: tid 4757: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH) 

01-03 18:43:35.591 4738-4757/com.example.rachel.safemessenger W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x923a4660, error=EGL_BAD_MATCH 

が助けてくださいがあります。

LoginActivity.java

package com.example.rachel.safemessenger; 

import android.animation.Animator; 
import android.animation.AnimatorListenerAdapter; 
import android.annotation.TargetApi; 
import android.content.pm.PackageManager; 
import android.support.annotation.NonNull; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.app.LoaderManager.LoaderCallbacks; 

import android.content.CursorLoader; 
import android.content.Loader; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.AsyncTask; 

import android.os.Build; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.text.TextUtils; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.inputmethod.EditorInfo; 
import android.widget.ArrayAdapter; 
import android.widget.AutoCompleteTextView; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

import static android.Manifest.permission.READ_CONTACTS; 

/** 
* A login screen that offers login via email/password. 
*/ 
public class LoginActivity extends AppCompatActivity implements LoaderCallbacks<Cursor> 
{ 

    /** 
    * Id to identity READ_CONTACTS permission request. 
    */ 
    private static final int REQUEST_READ_CONTACTS = 0; 

    /** 
    * A dummy authentication store containing known user names and passwords. 
    * TODO: remove after connecting to a real authentication system. 
    */ 
    private static final String[] DUMMY_CREDENTIALS = new String[]{ 
      "[email protected]:hello", "[email protected]:world" 
    }; 
    /** 
    * Keep track of the login task to ensure we can cancel it if requested. 
    */ 
    private UserLoginTask mAuthTask = null; 

    // UI references. 
    private AutoCompleteTextView mLoginView; 
    private EditText mPasswordView; 
    private View mProgressView; 
    private View mLoginFormView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
     // Set up the login form. 
     mLoginView = (AutoCompleteTextView) findViewById(R.id.activityLogin_login); 
     populateAutoComplete(); 

     mPasswordView = (EditText) findViewById(R.id.activityLogin_password); 
     mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() 
     { 
      @Override 
      public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) 
      { 
       if (id == R.id.login || id == EditorInfo.IME_NULL) 
       { 
        attemptLogin(); 
        return true; 
       } 
       return false; 
      } 
     }); 

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

     mLoginFormView = findViewById(R.id.activityLogin_login_form); 
     mProgressView = findViewById(R.id.activityLogin_login_progress); 
    } 

    private void populateAutoComplete() 
    { 
     if (!mayRequestContacts()) 
     { 
      return; 
     } 

     getLoaderManager().initLoader(0, null, this); 
    } 

    private boolean mayRequestContacts() 
    { 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) 
     { 
      return true; 
     } 
     if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) 
     { 
      return true; 
     } 
     if (shouldShowRequestPermissionRationale(READ_CONTACTS)) 
     { 
      Snackbar.make(mLoginView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE) 
        .setAction(android.R.string.ok, new View.OnClickListener() 
        { 
         @Override 
         @TargetApi(Build.VERSION_CODES.M) 
         public void onClick(View v) 
         { 
          requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); 
         } 
        }); 
     } else 
     { 
      requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); 
     } 
     return false; 
    } 

    /** 
    * Callback received when a permissions request has been completed. 
    */ 
    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
              @NonNull int[] grantResults) 
    { 
     if (requestCode == REQUEST_READ_CONTACTS) 
     { 
      if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
      { 
       populateAutoComplete(); 
      } 
     } 
    } 


    /** 
    * Attempts to sign in or register the account specified by the login form. 
    * If there are form errors (invalid email, missing fields, etc.), the 
    * errors are presented and no actual login attempt is made. 
    */ 
    private void attemptLogin() 
    { 
     if (mAuthTask != null) 
     { 
      return; 
     } 

     // Reset errors. 
     mLoginView.setError(null); 
     mPasswordView.setError(null); 

     // Store values at the time of the login attempt. 
     String login = mLoginView.getText().toString(); 
     String password = mPasswordView.getText().toString(); 

     boolean cancel = false; 
     View focusView = null; 

     // Check for a valid password, if the user entered one. 
     if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) 
     { 
      mPasswordView.setError(getString(R.string.error_invalid_password)); 
      focusView = mPasswordView; 
      cancel = true; 
     } 

     // Check for a valid login address. 
     if (TextUtils.isEmpty(login)) 
     { 
      mLoginView.setError(getString(R.string.error_field_required)); 
      focusView = mLoginView; 
      cancel = true; 
     } else if (!isLoginValid(login)) 
     { 
      mLoginView.setError(getString(R.string.error_invalid_login)); 
      focusView = mLoginView; 
      cancel = true; 
     } 

     if (cancel) 
     { 
      // There was an error; don't attempt login and focus the first 
      // form field with an error. 
      focusView.requestFocus(); 
     } else 
     { 
      // Show a progress spinner, and kick off a background task to 
      // perform the user login attempt. 
      showProgress(true); 
      mAuthTask = new UserLoginTask(login, password); 
      mAuthTask.execute((Void) null); 
     } 
    } 

    private boolean isLoginValid(String login) 
    { 
     //TODO: Replace this with your own logic 
     return login.contains("@"); 
    } 

    private boolean isPasswordValid(String password) 
    { 
     //TODO: Replace this with your own logic 
     return password.length() > 4; 
    } 

    /** 
    * Shows the progress UI and hides the login form. 
    */ 
    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
    private void showProgress(final boolean show) 
    { 
     // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow 
     // for very easy animations. If available, use these APIs to fade-in 
     // the progress spinner. 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) 
     { 
      int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); 

      mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); 
      mLoginFormView.animate().setDuration(shortAnimTime).alpha(
        show ? 0 : 1).setListener(new AnimatorListenerAdapter() 
      { 
       @Override 
       public void onAnimationEnd(Animator animation) 
       { 
        mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); 
       } 
      }); 

      mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); 
      mProgressView.animate().setDuration(shortAnimTime).alpha(
        show ? 1 : 0).setListener(new AnimatorListenerAdapter() 
      { 
       @Override 
       public void onAnimationEnd(Animator animation) 
       { 
        mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); 
       } 
      }); 
     } else 
     { 
      // The ViewPropertyAnimator APIs are not available, so simply show 
      // and hide the relevant UI components. 
      mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); 
      mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); 
     } 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) 
    { 
     return new CursorLoader(this, 
       // Retrieve data rows for the device user's 'profile' contact. 
       Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, 
         ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, 

       // Select only email addresses. 
       ContactsContract.Contacts.Data.MIMETYPE + 
         " = ?", new String[]{ContactsContract.CommonDataKinds.Email 
       .CONTENT_ITEM_TYPE}, 

       // Show primary email addresses first. Note that there won't be 
       // a primary email address if the user hasn't specified one. 
       ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) 
    { 
     List<String> logins = new ArrayList<>(); 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) 
     { 
      logins.add(cursor.getString(ProfileQuery.ADDRESS)); 
      cursor.moveToNext(); 
     } 

     addLoginsToAutoComplete(logins); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> cursorLoader) 
    { 

    } 

    private void addLoginsToAutoComplete(List<String> loginAddressCollection) 
    { 
     //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list. 
     ArrayAdapter<String> adapter = 
       new ArrayAdapter<>(LoginActivity.this, 
         android.R.layout.simple_dropdown_item_1line, loginAddressCollection); 

     mLoginView.setAdapter(adapter); 
    } 


    private interface ProfileQuery 
    { 
     String[] PROJECTION = { 
       ContactsContract.CommonDataKinds.Email.ADDRESS, 
       ContactsContract.CommonDataKinds.Email.IS_PRIMARY, 
     }; 

     int ADDRESS = 0; 
     int IS_PRIMARY = 1; 
    } 

    /** 
    * Represents an asynchronous login/registration task used to authenticate 
    * the user. 
    */ 
    public class UserLoginTask extends AsyncTask<Void, Void, Boolean> 
    { 

     private final String mLogin; 
     private final String mPassword; 

     UserLoginTask(String login, String password) 
     { 
      mLogin = login; 
      mPassword = password; 
     } 

     @Override 
     protected Boolean doInBackground(Void... params) 
     { 
      // TODO: attempt authentication against a network service. 

      try 
      { 
       // Simulate network access. 
       Thread.sleep(2000); 
      } catch (InterruptedException e) 
      { 
       return false; 
      } 

      for (String credential : DUMMY_CREDENTIALS) 
      { 
       String[] pieces = credential.split(":"); 
       if (pieces[0].equals(mLogin)) 
       { 
        // Account exists, return true if the password matches. 
        return pieces[1].equals(mPassword); 
       } 
      } 

      // TODO: register the new account here. 
      return true; 
     } 

     @Override 
     protected void onPostExecute(final Boolean success) 
     { 
      mAuthTask = null; 
      showProgress(false); 

      if (success) 
      { 
       finish(); 
      } else 
      { 
       mPasswordView.setError(getString(R.string.error_incorrect_password)); 
       mPasswordView.requestFocus(); 
      } 
     } 

     @Override 
     protected void onCancelled() 
     { 
      mAuthTask = null; 
      showProgress(false); 
     } 
    } 
} 

activity_login.xml

<LinearLayout 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:gravity="center_horizontal" 
    android:orientation="vertical" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.rachel.safemessenger.LoginActivity"> 

    <!-- Login progress --> 
    <ProgressBar 
     android:id="@+id/activityLogin_login_progress" 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="8dp" 
     android:visibility="gone" /> 

    <ScrollView 
     android:id="@+id/activityLogin_login_form" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 
      android:id="@+id/activityLogin_name_login_form" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <android.support.design.widget.TextInputLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"> 

       <AutoCompleteTextView 
        android:id="@+id/activityLogin_login" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:hint="@string/prompt_email" 

        android:maxLines="1" 
        android:singleLine="true" /> 

      </android.support.design.widget.TextInputLayout> 

      <android.support.design.widget.TextInputLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"> 

       <EditText 
        android:id="@+id/activityLogin_password" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:hint="@string/prompt_password" 
        android:imeActionId="@+id/login" 
        android:imeActionLabel="@string/action_sign_in_short" 
        android:imeOptions="actionUnspecified" 
        android:inputType="textPassword" 
        android:maxLines="1" 
        android:singleLine="true" /> 

      </android.support.design.widget.TextInputLayout> 

      <Button 
       android:id="@+id/activityLogin_name_sign_in_button" 
       style="?android:textAppearanceSmall" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="16dp" 
       android:text="@string/action_sign_in" 
       android:textStyle="bold" /> 

     </LinearLayout> 
    </ScrollView> 
</LinearLayout> 

のstrings.xml

<resources> 
    <string name="app_name">SafeMessenger</string> 

    <!-- Strings related to login --> 
    <string name="prompt_email">Nick</string> 
    <string name="prompt_password">Password </string> 
    <string name="action_sign_in">Sign in or register</string> 
    <string name="action_sign_in_short">Sign in</string> 
    <string name="error_invalid_login">This login is invalid</string> 
    <string name="error_invalid_password">This password is too short</string> 
    <string name="error_incorrect_password">This password is incorrect</string> 
    <string name="error_field_required">This field is required</string> 
    <string name="permission_rationale">"Contacts permissions are needed for providing email 
     completions." 
    </string> 
</resources> 
+0

コードをインラインで共有してください。 –

+0

この意味は?私は初心者です。 – Kainka

+0

私は外部ツールではなく質問の中にコードを入れています。 http://meta.stackexchange.com/questions/216464/how-to-insert-code-properly-on-stack-overflow –

答えて

0

OK、今では動作します。私は何とか私の参加なしで修正すると思います。

私はアンドロイドデバイスを更新してコンピュータをリセットして動作します。