2016-12-02 5 views
-1

私は、ユーザーがボタンをクリックするだけでSMS経由で自分の位置情報を送信できるアプリを作っています。私はアンドロイド5.1で実行されている携帯電話でこれをテストし、それはうまく動作しますが、私がmarshmellowでそれを実行しようとすると、メッセージを送信しません。私はそのコードがランタイム許可のためここにあると思います。ランタイム許可をどこに渡すべきかを教えてくださいアプリがmarshmallowで正常に動作していない

import android.Manifest; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Build; 
import android.support.annotation.NonNull; 
import android.support.v4.app.ActivityCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.telephony.SmsManager; 
import android.view.Gravity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.provider.Settings; 
import android.content.Intent; 
import android.widget.Toast; 


public class MainActivity extends AppCompatActivity { 
public Button button; 

private LocationManager locationManager; 
private LocationListener listener; 
private String gpslonla; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 






    button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(new View.OnClickListener() { 


     @Override 
     public void onClick(View view) { 
      getlocation(); 


     } 







    }); 

} 


private void getlocation() { 

    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

    listener = new LocationListener() { 



     @Override 
     public void onStatusChanged(String s, int i, Bundle bundle) { 

     } 

     @Override 
     public void onProviderEnabled(String s) { 

     } 

     @Override 
     public void onProviderDisabled(String s) { 
      Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      startActivity(i); 

     } 
     @Override 
     public void onLocationChanged(Location location) { 
      gpslonla=location.getLatitude()+ "," + location.getLongitude(); 
      sendlocationsms(); 
     } 

    }; 
    configure_button(); 
} 

private void sendlocationsms() { 
    String phoneNumber = "903399000"; 
    //Location location = new Location("dummyprovider"); 

    SmsManager smsManager = SmsManager.getDefault(); 
    StringBuffer smsBody = new StringBuffer(); 
    smsBody.append("http://maps.google.com?q="+gpslonla); 

    //smsBody.append(location.getLatitude()); 
    //smsBody.append(","); 
    //smsBody.append(location.getLongitude()); 
    smsManager.sendTextMessage(phoneNumber, null, smsBody.toString(), null, null); 

    Toast toast = Toast.makeText(getApplicationContext(), "Your message has been sent", Toast.LENGTH_LONG); 
    toast.setGravity(Gravity.CENTER, 0, 0); 
    toast.show(); 


} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case 10: 
      configure_button(); 
      break; 
     default: 
      break; 
    } 
} 

void configure_button() { 

私はここでSMSの許可を確認して下に要求してみました。しかし、それはSMSを送信しません。適切な解決策を提供してください。ありがとう。

// first check for permissions 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET} 
        , 10); 
     } 
     return; 
    } 
    // this code won't execute IF permissions are not allowed, because in the line above there is return statement. 

      locationManager.requestLocationUpdates("gps", 5000,5000, listener); 

} 



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main_menu, menu); 
    return true; 
} 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.menu1: 

      Toast.makeText(this, "Option1", Toast.LENGTH_SHORT).show(); 
      return true; 
     case R.id.menu2: 
      finish(); 

      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 
} 
+1

それは何のエラーと言っていますか? –

+0

onCreate()で起動している間に使用しようとしている機能に与えられた権限を確認することも、それらの機能を使用する前にチェックすることもできます。 – Raghavendra

+0

プロジェクトにエラーはありませんが、marshmellowでうまく動作しません。 – Yash

答えて

0

許可が問題になる場合は、一度、二重チェックすること:manifest.xmlに中

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

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED&&Manifest.permission.SEND_SMS!=PackageManager.PERMISSION_GRANTED) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET,Manifest.permission.SEND_SMS} 
       , 10); 
    } 
    return; 
} 
// this code won't execute IF permissions are not allowed, because in the line above there is return statement. 

     locationManager.requestLocationUpdates("gps", 5000,5000, listener); 

}

上記に加えたManifest.xmlで定義する必要がありパーミッション。

+0

ええ、私はマニフェストに必要なものすべてを追加しました。とrushi私もそこにSMSランタイムの権限を追加しましたが、何もボタンをクリックしたときに起こります。 – Yash

+0

ボタンリスナーからデバッグできますか? –

0

お試しください 最初にすべてのアクセス許可が付与されているかどうかを確認しますか? onCreateで

String[] allPermissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET, Manifest.permission.SEND_SMS}; 

をチェックして

() チェック

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    if(!hasPermissions(this, allPermissions)){ 
     requestPermissions(allPermissions, 10); 
} 
} 



public 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; 
    } 
関連する問題