String id 에 추출한 번호 불러오는 방법
본문
메인 자바 전체 소스입니다....
아래 소스중
String id = myPhoneNumber(MainActivity.this);
이부분이 문제 인데요....
여기에
String id = "핸드폰번호"; <- 이처럼 전화번호를 직접 입력해서 빌드하면 정상 작동 합니다.
하지만 String id = myPhoneNumber(MainActivity.this);
해서 내폰번호를 가져오기로 적용하면 작동을 안합니다
폰 번호 적용시 따옴표 안에 번호가 적혀져야지 정상 작동을 합니다..
머가 문제인 걸까요? 전화번호 불러오는 방식이 잘못 된걸까요?
아니면 스트링에 내번호 자동으로 불러오는 방식으로는 작동불가인 건가요??
메인페스트에 권한 지정은
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
이렇게 되어 있습니다.
package call.exam.jsh.telepo;
import android.Manifest;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.os.AsyncTask;
import android.widget.TextView;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;
import static android.R.attr.name;
import static call.exam.jsh.telepo.R.layout.activity_main;
public class MainActivity extends AppCompatActivity {
private Button button;
private Button button1;
Button button2;
Button button3;
TextView txtview;
phpdo task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(activity_main);
button = (Button) findViewById(R.id.button);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.Button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Pop.class));
}
});
button3 = (Button) findViewById(R.id.Button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Pop1.class));
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 사용자의 OS 버전이 마시멜로우 이상인지 체크한다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
/** * 사용자 단말기의 권한 중 "전화걸기" 권한이 허용되어 있는지 확인한다. * Android는 C언어 기반으로 만들어졌기 때문에 Boolean 타입보다 Int 타입을 사용한다.
*
*/
int permissionResult = checkSelfPermission(Manifest.permission.CALL_PHONE);
/** * 패키지는 안드로이드 어플리케이션의 아이디이다. * 현재 어플리케이션이 CALL_PHONE에 대해 거부되어있는지 확인한다. */
if (permissionResult == PackageManager.PERMISSION_DENIED) {
/** * 사용자가 CALL_PHONE 권한을 거부한 적이 있는지 확인한다. * 거부한적이 있으면 True를 리턴하고 * 거부한적이 없으면 False를 리턴한다. */
if (shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) {
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("권한이 필요합니다.")
.setMessage("이 기능을 사용하기 위해서는 단말기의 \"전화걸기\" 권한이 필요합니다. 계속 하시겠습니까?")
.setPositiveButton("네", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
/** * 새로운 인스턴스(onClickListener)를 생성했기 때문에 * 버전체크를 다시 해준다. */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// CALL_PHONE 권한을 Android OS에 요청한다.
requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);
}
}
})
.setNegativeButton("아니요", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "기능을 취소했습니다", Toast.LENGTH_SHORT).show();
}
})
.create()
.show();
}
// 최초로 권한을 요청할 때
else {
// CALL_PHONE 권한을 Android OS에 요청한다.
requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);
}
}
// CALL_PHONE의 권한이 있을 때
else {
// 즉시 실행
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:*** 개인정보보호를 위한 휴대폰번호 노출방지 ***"));
startActivity(intent);
}
}
// 마시멜로우 미만의 버전일 때
else {
// 즉시 실행
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:*** 개인정보보호를 위한 휴대폰번호 노출방지 ***"));
startActivity(intent);
}
}
});
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 사용자의 OS 버전이 마시멜로우 이상인지 체크한다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
/** * 사용자 단말기의 권한 중 "전화걸기" 권한이 허용되어 있는지 확인한다. * Android는 C언어 기반으로 만들어졌기 때문에 Boolean 타입보다 Int 타입을 사용한다.
*
*/
int permissionResult = checkSelfPermission(Manifest.permission.CALL_PHONE);
/** * 패키지는 안드로이드 어플리케이션의 아이디이다. * 현재 어플리케이션이 CALL_PHONE에 대해 거부되어있는지 확인한다. */
if (permissionResult == PackageManager.PERMISSION_DENIED) {
/** * 사용자가 CALL_PHONE 권한을 거부한 적이 있는지 확인한다. * 거부한적이 있으면 True를 리턴하고 * 거부한적이 없으면 False를 리턴한다. */
if (shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) {
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("권한이 필요합니다.")
.setMessage("이 기능을 사용하기 위해서는 단말기의 \"전화걸기\" 권한이 필요합니다. 계속 하시겠습니까?")
.setPositiveButton("네", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
/** * 새로운 인스턴스(onClickListener)를 생성했기 때문에 * 버전체크를 다시 해준다. */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// CALL_PHONE 권한을 Android OS에 요청한다.
requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);
}
}
})
.setNegativeButton("아니요", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "기능을 취소했습니다", Toast.LENGTH_SHORT).show();
}
})
.create()
.show();
}
// 최초로 권한을 요청할 때
else {
// CALL_PHONE 권한을 Android OS에 요청한다.
requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);
}
}
// CALL_PHONE의 권한이 있을 때
else {
// 즉시 실행
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:*** 개인정보보호를 위한 전화번호 노출방지 ***"));
startActivity(intent);
}
}
// 마시멜로우 미만의 버전일 때
else {
// 즉시 실행
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:*** 개인정보보호를 위한 전화번호 노출방지 ***"));
startActivity(intent);
}
}
});
String id = myPhoneNumber(MainActivity.this);
String name = "";
task = new phpdo();
txtview = (TextView) findViewById(R.id.txtView);
task.execute(id, name);
}
public static String myPhoneNumber(Context context) {
String myNumber = null;
TelephonyManager mgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try{
myNumber = mgr.getLine1Number();
myNumber = myNumber.replace("+82", "0");
myNumber = "'"+ myNumber+"'";
}catch(Exception e){}
return myNumber;
}
private class phpdo extends AsyncTask<String, Void, String> {
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... arg0) {
try {
String id = arg0[0];
String link = "http://sun7684.dothome.co.kr/testquery.php?ID=" + id + "&NAME=" + name;
URL url = new URL(link);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(link));
HttpResponse response = client.execute(request);
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line = "";
while ((line = in.readLine()) != null) {
sb.append(line);
break;
}
in.close();
return sb.toString();
} catch (Exception e) {
return new String("Exception: " + e.getMessage());
}
}
@Override
protected void onPostExecute(String result) {
//txtview.setText("Login Successful");
txtview.setText(result);
}
}
}
답변 2
우선 myPhoneNumber메소드의
catch 영역에
Exception 이 빌생할때 어떤 오류인지 로그를 찍어보시고
따옴표 추가부분을 막고
myPhoneNumber를 호출한
String id =..
이후에서
id = "'"+id+''";
로 변경해서 시도해보심이 어떨까요?
이 내용들은 실제 컴파일과 실행을 확인해봐야 좀 명확할것 같긴합니다만
오류가 발생하는 영역에 try {} catch를 잘 활용하시면서 오류를 잡아
원인을 찾는게 중요합니다
잘 되는 방식과 안되는 방식을 설명해 놓으신게
"전번" 으로 되어야 한다하신것이 조금 애매한 느낌만 있는데
" 없이 어디까지 되는지를 찾는게 우산인거 같습니다
안드로이드 시작하는 입장이시면
https://opentutorials.org/module/2816/16162
여기서 동영상을 보면서 공부해보시는게 어떠실런지요
짜집기는
그 이후에 진행하시는게 더 좋으실수 있습니다
참.. 그전에 자바의 기본 문법은 익히시고 하시는게 더 좋습니다
https://opentutorials.org/module/2816/16162
여기서 동영상을 보면서 공부해보시는게 어떠실런지요
짜집기는
그 이후에 진행하시는게 더 좋으실수 있습니다
참.. 그전에 자바의 기본 문법은 익히시고 하시는게 더 좋습니다
답변을 작성하시기 전에 로그인 해주세요.