2016-04-04 6 views
0

Hallo im eine Anwendung mit Android Studios die benötigt 3 Berechtigungen insgesamtWie bitte nach Berechtigungen für Runtime gefragt werden?

CALL_PHONE machen, READ_CONTACTS, RECORD_AUDIO.

im kinda neuen sehr für die Entwicklung und das ist, warum meine Codierung ein bisschen schlampig ist (kein Scherz), wenn ich laufe die App funktioniert es nicht für die Erlaubnis und nicht funktioniert, fragt aber wenn ich gehe manuell einstellen und gewährt die Berechtigungen es funktioniert gut Ich bin mit Fragmenten und das Schreiben des Codes in der Fragment-Klasse ist das falsch oder sollte ich diesen Code in meine mainActivity.java schreiben Im Anfügen beide bitte schauen Sie auf meinen Code und wie kann ich es verbessern Wenn ich muss arbeite von Grund auf im im ok damit.

DialerActivity.java:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 


public class DialerActivity extends FragmentActivity { 

private static final String FRAGMENT_TAG_DIALER = "fragment:dialer"; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_dialer); 

    FragmentManager fm = getSupportFragmentManager(); 
    Fragment fragment = (DialerFragment) fm.findFragmentByTag(FRAGMENT_TAG_DIALER); 

     if(fragment == null){ 
      fragment = new DialerFragment(); 
      fm.beginTransaction() 
        .add(R.id.fragment_container,fragment, FRAGMENT_TAG_DIALER) 
        .commit(); 
     } 
} 
} 

DialerFragmnet.java:

import android.Manifest; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast;; 
import android.support.v4.content.ContextCompat; 


public class DialerFragment extends Fragment { 
    private EditText mPhoneField; 
    private Button mDialButton; 

//Requesting Permissions on Runtime. 
final private int REQUEST_CODE_ASK_PERMISSIONS=0; 

private void InitiateCall(){ 
    int hasCallPermission = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE); 
    if (hasCallPermission != PackageManager.PERMISSION_GRANTED){ 
     requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 
       REQUEST_CODE_ASK_PERMISSIONS); 
     return; 
    } 
    InitiateCall(); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){ 
    switch (requestCode){ 
     case REQUEST_CODE_ASK_PERMISSIONS: 
      if (grantResults[0]==PackageManager.PERMISSION_GRANTED){ 
       //YAY! PERMISSION GRANTED 
       InitiateCall(); 
      }else{ 
       //GD! PERMISSION DENIED 
       Toast.makeText(getActivity(), R.string.permission_denied, Toast.LENGTH_SHORT).show(); 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    } 
} 



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

} 

@Override 
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){ 
    View v=inflater.inflate(R.layout.fragment_dialer,container,false); 

    mPhoneField=(EditText) v.findViewById(R.id.input_pno); 
    mDialButton=(Button) v.findViewById(R.id.dial_button); 

    mDialButton.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v){ 
      try{ 
       if (mPhoneField != null && (mPhoneField.getText().length()==10||mPhoneField.getText().length()==11)){ 
        startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + mPhoneField.getText()))); 
       } 
       else if(mPhoneField != null && mPhoneField.getText().length()==0){ 
        Toast.makeText(getActivity(),R.string.no_number_toast,Toast.LENGTH_SHORT).show(); 
       } 
       else if(mPhoneField !=null && mPhoneField.getText().length()<10){ 
        Toast.makeText(getActivity(),R.string.wrong_number_toast,Toast.LENGTH_SHORT).show(); 
       } 
      } catch (Exception e){ 
       Log.e("DialerAppActivity","error: " + e.getMessage(),e);//Runtime error will be logged 
      } 
     } 
    }); 


    return v; 
} 

} 

Antwort

1

Sie eigentlich nie Ihre Methode aufrufen, die die Erlaubnis bitten. Ihre Methode: InitiateCall sollte sich nicht selbst aufrufen, weil es eine unendliche Schleife erstellen wird. So sollten Sie es ändern, so sein:

private void InitiateCall(){ 
    int hasCallPermission = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE); 
    if (hasCallPermission != PackageManager.PERMISSION_GRANTED){ 
     requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 
       REQUEST_CODE_ASK_PERMISSIONS); 
     return; 
    } 
} 

und Sie InitiateCall am Ende des onCreateView aufrufen können.

+0

Wenn ich die Funktion am Ende der onCreateView aufrufen sagt es die Methode ist nicht erreichbar, aber wenn ich es vor dem Listener auf dem mDialButton es funktioniert, Und ist meine Codierung strukturell richtig? Ich meine, ich fühle, dass die Dinge nicht an einem geeigneten Ort sind. – HeroicJokester

+0

Sie müssen es vor dem 'return v;' aufrufen, wenn Sie es aufrufen, bevor es nicht kompiliert wird, weil die Methode onCreateView nach dem Aufruf von return beendet wird. Deshalb ist es danach nicht erreichbar. – Andros

+0

Danke Mann, der funktioniert hat! Jetzt füge ich den rationalen Teil für die Erlaubnis hinzu – HeroicJokester

Verwandte Themen