2017-06-06 146 views
-2

我有一個應用程序,需要先詢問兩個權限,才能讀取聯繫人並在extrernal存儲中寫入文件。問題是,當應用程序在第一次崩潰時打開並請求權限,當我重新打開它時,一切都很好,應用程序運行順利。 MainActivity.javaAndroid請求多權限

public class MainActivity extends AppCompatActivity implements 
     LoaderManager.LoaderCallbacks<Cursor>, 
     AdapterView.OnItemClickListener, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener 
     { 


    /** 
    * Global variables 
    */ 
    private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100; 
    private ListView mContactsList; //the listview to display contacts 
    private LinearLayout contactLayout; //the listview item layout for each contact 
    private SimpleCursorAdapter mCursorAdapter; // An adapter that binds the result Cursor to the ListView 
    private boolean bigmode = false; //flag indicating whether we are currently using the normal or big contact layout 
    public GoogleApiClient mApiClient; //client to the google play services activity detection 
    private int activityDetectionInterval = 3000; //how often to request an activity detection in milliseconds 

    /* 
    * Defines an array that contains column names to move from 
    * the Cursor to the ListView (we really just want the name). 
    */ 


    private final static String[] FROM_COLUMNS = { 
      ContactsContract.Contacts.DISPLAY_NAME 
    }; 

    /* 
    * Defines an array that contains column names to retrieve from the 
    * contacts DB when we query it (we really just want the name). 
    */ 

    private static final String[] PROJECTION = 
      { 
        ContactsContract.Contacts._ID, 
        ContactsContract.Contacts.DISPLAY_NAME 
      }; 


    /* 
    * Defines an array that contains resource ids for the listview item layout views 
    * that get the Cursor column contents. 
    */ 

    private final static int[] TO_IDS = { 
      R.id.label 
    }; 

    /** 
    * Methods 
    */ 

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

     /* showContacts(); // Ask permission to read contacts 
     showlogs(); // Ask permission to create file where we write the logs*/ 

     setContentView(R.layout.activity_main); 

     // set up the action toolbar 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     // set up the listview by retrieving contacts 

     mContactsList = (ListView) findViewById(R.id.listView); 
     //setup an adapter to populate the listview 
     mCursorAdapter = new SimpleCursorAdapter(
       this, 
       R.layout.contacts_list_item, 
       null, 
       FROM_COLUMNS, TO_IDS, 
       0); 

      // Sets the adapter for the ListView 
     mContactsList.setAdapter(mCursorAdapter); 
     // set up the listener for the listview - it will be handled by code in this activity 
     mContactsList.setOnItemClickListener(this); 
     //call the cursor loader 
     getLoaderManager().initLoader(0, null, this); 
     // set up the "zoom" button 

     final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     // set up the click action - toggle between big and normal layouts 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       toggleDisplaySize(); 
      } 
     }); 

     // set up the client for google play services so we can request activity detection later 
     Log.i("START", "Start"); 
     writefile("START"); 
     mApiClient = new GoogleApiClient.Builder(this) 
       .addApi(ActivityRecognition.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
     mApiClient.connect(); 

       mContactsList.setOnScrollListener(new AbsListView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 
       Log.i("Scroll", "Scroll list"); // When user scrolled the list 
       writefile("SCROLL"); 
      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

      } 
     });} 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * when the application is ready to be brought to the front, we must assess whether to use 
    * the big or normal layouts 
    */ 
    @Override 
    public void onResume() { 
     super.onResume(); 

     //check the shared preference value set by the activity detection service 

     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
     if (sp.getBoolean("isWalking", false)) { 
      bigmode = false; 
     } else { 
      bigmode = true; 
     } 
     //set the appropriate layout for the listview 
     toggleDisplaySize(); 

    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
     // Starts the query and returns the result cursor 

     // we only want the "name" column and also we want it sorted alphabetically 
     return new CursorLoader(
       this, 
       ContactsContract.Contacts.CONTENT_URI, 
       PROJECTION, 
       null, 
       null, 
       "DISPLAY_NAME ASC" 
     ); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     // Put the result Cursor in the adapter for the ListView 
     //Log.i("CursorLoaderFinished", "retrieved "+ cursor.getCount()+" contacts"); 
     mCursorAdapter.swapCursor(cursor); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     // Delete the reference to the existing Cursor 
     mCursorAdapter.swapCursor(null); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     // show a toast with the contact name 
     Log.i("onItemClick", "Click"); 
     writefile("CLICK "+String.valueOf(((TextView) view.findViewById(R.id.label)).getText())); 
     Log.i("Name", String.valueOf(((TextView) view.findViewById(R.id.label)).getText())); 
     //writefile(String.valueOf(((TextView) view.findViewById(R.id.label)).getText())); 
     Toast.makeText(this, ((TextView) view.findViewById(R.id.label)).getText(), Toast.LENGTH_SHORT).show(); 
    } 

    /** 
    * the google play services client is ready, now we can start requesting activity 
    * detection updates from it 
    */ 
    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     //create an intent pointing to the background service which will update our current activity 
     Intent intent = new Intent(this, ActivityRecognizedService.class); 
     PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     //request updates 
     ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(mApiClient, activityDetectionInterval, pendingIntent); 

    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    /** 
    * this method selects and sets the appropriate listview layout according to whether we should 
    * be in big or normal mode (either from a zoom button click, or because the service has detected 
    * that we are currently walking 
    */ 
    public void toggleDisplaySize() { 

     int layoutid; 
     if (!bigmode) { 
      Log.i("ZOOM", "1");//ZOOM IN 
      writefile("ZOOM_1"); 
      layoutid = R.layout.contacts_list_item_big; 
      bigmode = true; 
     } else { 
      Log.i("ZOOM", "0");//ZOOM OUT 
      writefile("ZOOM_0"); 
      layoutid = R.layout.contacts_list_item; 
      bigmode = false; 
     } 

     mCursorAdapter = new SimpleCursorAdapter(
       getApplicationContext(), 
       layoutid, 
       null, 
       FROM_COLUMNS, TO_IDS, 
       0); 
     mContactsList.setAdapter(mCursorAdapter); 
     getLoaderManager().initLoader(0, null, MainActivity.this); 

    } 


/* 
    private void showContacts() { 
     // Check the SDK version and whether the permission is already granted or not. To get te contacts 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS); 
      ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
     } 
    } 

    private void showlogs() { 
     //Check the SDK version and whether the permission is already granted or not. To be able to create and write in file 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
      } 
     } 

    }*/ 
public void askpermissions(){ 
    int PERMISSION_ALL = 1; 
    String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_EXTERNAL_STORAGE}; 

    if(!hasPermissions(this, PERMISSIONS)){ 
     ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL); 
    } 

} 

public static boolean hasPermissions(Context context, String... permissions) { 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
     for (String permission : permissions) { 
      if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { 
       return false; 
      } 
     } 
    } 
    return true; 
} 

    public void writefile(String te){ 
     //Write in file the logs 
     te =gettime()+' '+te+'\n'; 
     File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "Logs"); 
     if (! file.exists()){ 
      try { 
       file.createNewFile(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     FileWriter fileWriter = null; 
     try { 
      fileWriter = new FileWriter(file,true); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try { 
      fileWriter.write(te); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try { 
      fileWriter.flush(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try { 
      fileWriter.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 


public String gettime(){ 
    String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date()); 
    return timeStamp; 


} 

} 

我請求許可與askpermissions();函數...有什麼想法可以是我的代碼錯誤?

+0

因爲askpermissions不堵......所以很明顯,即使你沒有權限整個​​的onCreate代碼被稱爲......包括initLoader – Selvin

+0

因爲我只是一個初學者機器人,你能告訴我如何做到這一點? thx –

+0

是的當然...在官方Android開發者網站上找到指南,並按照它... – Selvin

回答

-1

編輯您這樣的代碼

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

    /* showContacts(); // Ask permission to read contacts 
    showlogs(); // Ask permission to create file where we write the logs*/ 

    setContentView(R.layout.activity_main); 

    // set up the action toolbar 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    // set up the listview by retrieving contacts 

    mContactsList = (ListView) findViewById(R.id.listView); 
    //setup an adapter to populate the listview 
    mCursorAdapter = new SimpleCursorAdapter(
      this, 
      R.layout.contacts_list_item, 
      null, 
      FROM_COLUMNS, TO_IDS, 
      0); 

     // Sets the adapter for the ListView 
    mContactsList.setAdapter(mCursorAdapter); 
    // set up the listener for the listview - it will be handled by code in this activity 
    mContactsList.setOnItemClickListener(this); 
    //call the cursor loader 
    getLoaderManager().initLoader(0, null, this); 
    // set up the "zoom" button 

    final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    // set up the click action - toggle between big and normal layouts 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      toggleDisplaySize(); 
     } 
    }); 

    // set up the client for google play services so we can request activity detection later 

askpermissions(); 
    } 


void permissionGranted() 
{ Log.i("START", "Start"); 
    writefile("START"); 
    mApiClient = new GoogleApiClient.Builder(this) 
      .addApi(ActivityRecognition.API) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 
    mApiClient.connect(); 

      mContactsList.setOnScrollListener(new AbsListView.OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) 
    { 
       Log.i("Scroll", "Scroll list"); // When user scrolled the list 
       writefile("SCROLL"); 
     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

     } 
    });} 

public static boolean hasPermissions(Context context, String... permissions) { 
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
    for (String permission : permissions) { 
     if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { 
      return false; 
     }else{ 
permissionGranted();} 
    } 
} 
return true; 
} 

public void askpermissions(){ 
int PERMISSION_ALL = 1; 
String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_EXTERNAL_STORAGE}; 

if(!hasPermissions(this, PERMISSIONS)){ 
    ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL); 
}else 
permissionGranted(); 
}