디버깅 목적으로 인 텐트의 모든 엑스트라 (및 해당 값)를 나열하고 싶습니다. 이제 열쇠를 얻는 것은 문제가되지 않습니다
Set<String> keys = intent.getExtras().keySet();
그러나 키의 값을 얻는 것은 나에게는 하나입니다. 일부 값은 문자열이고 일부는 부울입니다 ... 루프에서 값을 가져오고 (키를 반복하는) 값을 로그 파일에 쓰는 방법은 무엇입니까? 힌트 주셔서 감사합니다!
디버깅 목적으로 인 텐트의 모든 엑스트라 (및 해당 값)를 나열하고 싶습니다. 이제 열쇠를 얻는 것은 문제가되지 않습니다
Set<String> keys = intent.getExtras().keySet();
그러나 키의 값을 얻는 것은 나에게는 하나입니다. 일부 값은 문자열이고 일부는 부울입니다 ... 루프에서 값을 가져오고 (키를 반복하는) 값을 로그 파일에 쓰는 방법은 무엇입니까? 힌트 주셔서 감사합니다!
답변:
문서화되지 않은 (타사) 의도에 대한 정보를 얻는 데 사용한 내용은 다음과 같습니다.
Bundle bundle = intent.getExtras();
if (bundle != null) {
for (String key : bundle.keySet()) {
Log.e(TAG, key + " : " + (bundle.get(key) != null ? bundle.get(key) : "NULL"));
}
}
bundle
루프 전에 null 인지 확인하십시오 .
if (bundle == null) { return; }
FTW
Bundle bundle = data.getExtras();
data
의도는 어디에 있습니까 ? 안드로이드 초보자를위한.
value = "null"
.
이것이 인 텐트의 모든 여분을 덤프하는 유틸리티 메소드를 정의하는 방법입니다.
import java.util.Iterator;
import java.util.Set;
import android.os.Bundle;
public static void dumpIntent(Intent i){
Bundle bundle = i.getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
Iterator<String> it = keys.iterator();
Log.e(LOG_TAG,"Dumping Intent start");
while (it.hasNext()) {
String key = it.next();
Log.e(LOG_TAG,"[" + key + "=" + bundle.get(key)+"]");
}
Log.e(LOG_TAG,"Dumping Intent end");
}
}
한 줄의 코드로 할 수 있습니다.
Log.d("intent URI", intent.toUri(0));
다음과 같이 출력됩니다.
"#Intent; action = android.intent.action.MAIN; category = android.intent.category.LAUNCHER; launchFlags = 0x10a00000; component = com.mydomain.myapp / .StartActivity; sourceBounds = 12 % 20870 % 20276 % 201167; l .profile = 0; 끝 "
이 문자열의 끝에 (굵은 글씨로 표시 한 부분) 추가 목록 (이 예제에서는 하나만 추가)을 찾을 수 있습니다.
이것은 toUri 문서 에 따르면 : "URI는 인 텐트의 데이터를 기본 URI로 포함하고 액션, 카테고리, 유형, 플래그, 패키지, 구성 요소 및 기타를 설명하는 추가 조각으로 구성됩니다."
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
tv.setText("Extras: \n\r");
setContentView(tv);
StringBuilder str = new StringBuilder();
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
String key = it.next();
str.append(key);
str.append(":");
str.append(bundle.get(key));
str.append("\n\r");
}
tv.setText(str.toString());
}
}
Bundle의 get (String key) 메소드는 Object를 리턴합니다. 가장 좋은 방법은 각 키에서 get (String)을 호출하고 Object에서 toString ()을 사용하여 키 세트를 출력하는 것입니다. 이것은 프리미티브에 가장 효과적이지만 toString ()을 구현하지 않는 객체에 문제가 발생할 수 있습니다.
의도의 내용을 로그에 출력하고 쉽게 읽을 수있는 방법을 원했습니다. 그래서 여기에 생각해 냈습니다. LogUtil
클래스를 만든 다음 dumpIntent()
@Pratik이 만든 메서드를 사용하여 조금 수정했습니다. 모든 모습은 다음과 같습니다.
public class LogUtil {
private static final String TAG = "IntentDump";
public static void dumpIntent(Intent i){
Bundle bundle = i.getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("IntentDump \n\r");
stringBuilder.append("-------------------------------------------------------------\n\r");
for (String key : keys) {
stringBuilder.append(key).append("=").append(bundle.get(key)).append("\n\r");
}
stringBuilder.append("-------------------------------------------------------------\n\r");
Log.i(TAG, stringBuilder.toString());
}
}
}
이것이 누군가를 돕기를 바랍니다!
이것이 너무 장황하거나 너무 늦다면 미안하지만, 이것이 내가 일을 끝내는 유일한 방법이었습니다. 가장 복잡한 요인은 java가 참조 함수를 통과하지 않았기 때문에 get --- Extra 메소드는 기본값을 반환해야하며 부울 값을 수정하여 기본값이 우연히 반환되는지 여부를 알 수 없다는 점입니다. 또는 결과가 좋지 않았기 때문입니다. 이를 위해 메소드가 기본값을 리턴하는 것보다 예외를 발생시키는 것이 더 좋을 것입니다.
내 정보는 Android Intent Documentation 에서 찾았습니다 .
//substitute your own intent here
Intent intent = new Intent();
intent.putExtra("first", "hello");
intent.putExtra("second", 1);
intent.putExtra("third", true);
intent.putExtra("fourth", 1.01);
// convert the set to a string array
String[] anArray = {};
Set<String> extras1 = (Set<String>) intent.getExtras().keySet();
String[] extras = (String[]) extras1.toArray(anArray);
// an arraylist to hold all of the strings
// rather than putting strings in here, you could display them
ArrayList<String> endResult = new ArrayList<String>();
for (int i=0; i<extras.length; i++) {
//try using as a String
String aString = intent.getStringExtra(extras[i]);
// is a string, because the default return value for a non-string is null
if (aString != null) {
endResult.add(extras[i] + " : " + aString);
}
// not a string
else {
// try the next data type, int
int anInt = intent.getIntExtra(extras[i], 0);
// is the default value signifying that either it is not an int or that it happens to be 0
if (anInt == 0) {
// is an int value that happens to be 0, the same as the default value
if (intent.getIntExtra(extras[i], 1) != 1) {
endResult.add(extras[i] + " : " + Integer.toString(anInt));
}
// not an int value
// try double (also works for float)
else {
double aDouble = intent.getDoubleExtra(extras[i], 0.0);
// is the same as the default value, but does not necessarily mean that it is not double
if (aDouble == 0.0) {
// just happens that it was 0.0 and is a double
if (intent.getDoubleExtra(extras[i], 1.0) != 1.0) {
endResult.add(extras[i] + " : " + Double.toString(aDouble));
}
// keep looking...
else {
// lastly check for boolean
boolean aBool = intent.getBooleanExtra(extras[i], false);
// same as default, but not necessarily not a bool (still could be a bool)
if (aBool == false) {
// it is a bool!
if (intent.getBooleanExtra(extras[i], true) != true) {
endResult.add(extras[i] + " : " + Boolean.toString(aBool));
}
else {
//well, the road ends here unless you want to add some more data types
}
}
// it is a bool
else {
endResult.add(extras[i] + " : " + Boolean.toString(aBool));
}
}
}
// is a double
else {
endResult.add(extras[i] + " : " + Double.toString(aDouble));
}
}
}
// is an int value
else {
endResult.add(extras[i] + " : " + Integer.toString(anInt));
}
}
}
// to display at the end
for (int i=0; i<endResult.size(); i++) {
Toast.makeText(this, endResult.get(i), Toast.LENGTH_SHORT).show();
}
Kotlin 버전의 Pratik 유틸리티 방법 으로 모든 추가 기능을 덤프합니다.
fun dumpIntent(intent: Intent) {
val bundle: Bundle = intent.extras ?: return
val keys = bundle.keySet()
val it = keys.iterator()
Log.d(TAG, "Dumping intent start")
while (it.hasNext()) {
val key = it.next()
Log.d(TAG,"[" + key + "=" + bundle.get(key)+"]");
}
Log.d(TAG, "Dumping intent finish")
}
for (key in bundle.keySet())
디버깅을 위해 원하는 것이 문자열 (OP에 의해 암시되지만 명시 적으로 언급되지 않은 정렬) 인 toString
경우 extras 를 사용 하십시오 Bundle
.
intent.getExtras().toString()
다음과 같은 문자열을 반환합니다.
Bundle[{key1=value1, key2=value2, key3=value3}]
문서 : Bundle.toString () (불행히도 기본 Object.toString()
javadoc이며 여기서는 쓸모가 없습니다.)