Analytics में एक खुली समस्या है। मैं एक ही व्यवहार का सामना कर रहा हूँ, लेकिन एपीआई 10 से वास्तविक उपकरणों पर 19.
https://code.google.com/p/analytics-issues/issues/detail?id=443
EDIT1: निकाला सवाल, बस सवाल वर्णित जवाब देने के लिए।
EDIT2: मैंने Analytics अपवाद बिल्डर का उपयोग करके अपवादों को पकड़ने और भेजने की कोशिश की, लेकिन यह काम नहीं किया।
ऐसा लगता है कि रिपोर्ट भेजी जाती है (कम से कम लॉगकैट दिखा रहा है कि क्रैश की सूचना दी गई है), लेकिन यह Analytics द्वारा संसाधित नहीं है।
जबकि Google इस मुद्दे का उत्तर देता है, तो मैं इस कार्यवाही का उपयोग कर रहा हूं। मुझे लगता है कि यह सबसे अच्छा समाधान नहीं है और कोड सुधार किया जा सकता है, लेकिन यह मेरे लिए काम करता है:
मैं निम्नलिखित इस कदम https://support.google.com/analytics/answer/2709829?hl=en
मेरे एप्लिकेशन में Analytics में एक कस्टम आयाम बनाया है, मेरे द्वारा बनाए गए Analytics अपवाद रिपोर्टर क्लास का उपयोग करते हुए एक कस्टम अपवाद हैंडलर। जब एक अपवाद पकड़ा जाता है, तो मुझे स्टैक ट्रेस मिलता है और इसे 150 बाइट्स तक छोटा कर दिया जाता है (असल में मुझे केवल स्टैक की पहली पंक्ति मिल रही है और इसे 150 वर्णों तक छीन लेती है। मुझे लगता है कि 1Char = 1 बाइट)। मुझे इसे छोटा करना है, क्योंकि यह कस्टम आयाम मान भेजते समय Analytics द्वारा अनुमत अधिकतम लेनगेट है। स्टैक ट्रेस भेजने के बजाए साझा वरीयता में संग्रहीत किया जाता है। मैंने इसे सीधे भेजने की कोशिश की, लेकिन ऐप क्रैश होने के बाद यह काम नहीं करता है।
package com.company.package;
import java.lang.Thread.UncaughtExceptionHandler;
import android.content.Context;
import com.google.android.gms.analytics.ExceptionParser;
import com.google.android.gms.analytics.ExceptionReporter;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
public class GoogleAnalyticsTracker {
private static Tracker mTracker;
private static GoogleAnalytics mGa;
private Context mContext;
public GoogleAnalyticsTracker(Context context, int resource) {
mContext = context;
mGa = GoogleAnalytics.getInstance(context);
mTracker = getTracker(resource);
Thread.setDefaultUncaughtExceptionHandler(new AnalyticsExceptionReporter(mTracker,
Thread.getDefaultUncaughtExceptionHandler(), context));
}
synchronized Tracker getTracker(int xmlResource) {
return mGa.newTracker(xmlResource);
}
public void sendScreenLabel(String screenLabel) {
mTracker.setScreenName(screenLabel);
mTracker.send(new HitBuilders.AppViewBuilder().build());
}
public void sendCustomDimension(int index, String value) {
mTracker.send(new HitBuilders.AppViewBuilder().setCustomDimension(index, value).build());
}
private class AnalyticsExceptionReporter extends ExceptionReporter {
public AnalyticsExceptionReporter(Tracker tracker, UncaughtExceptionHandler originalHandler, Context context) {
super(tracker, originalHandler, context);
setExceptionParser(new AnalyticsExceptionParser());
}
@Override
public void uncaughtException(Thread t, Throwable e) {
String exceptionDescription = getExceptionParser().getDescription(t.getName(), e);
//Add code to store the exception stack trace in shared preferences
super.uncaughtException(t, e);
}
}
private class AnalyticsExceptionParser implements ExceptionParser {
@Override
public String getDescription(String arg0, Throwable arg1) {
StringBuilder exceptionFirsLine = new StringBuilder();
for (StackTraceElement element : arg1.getStackTrace()) {
exceptionFirsLine.append(element.toString());
break;
}
//150 Bytes is the maximum allowed by Analytics for custom dimensions values. Assumed that 1 Byte = 1 Character (UTF-8)
String exceptionDescription = exceptionFirsLine.toString();
if(exceptionDescription.length() > 150)
exceptionDescription = exceptionDescription.substring(0, 149);
return exceptionDescription;
}
}
}
MainActivity में जब onStart(), मैं जाँच अगर वहाँ साझा वरीयताओं में किसी भी संग्रहीत स्टैक ट्रेस है। यदि ऐसा है, तो मैं कस्टम आयाम भेजता हूं और साझा वरीयता को साफ़ करता हूं।
@Override
protected void onStart() {
super.onStart();
String exception = getExceptionFromSharedPreferences(this);
if(exception != null && !exception.isEmpty()) {
MainApplication.googleAnalyticsTracker.sendCustomDimension(1, exception);
}
clearExceptionFromSharedPreferences(this);
}
अंत में मैं एक कस्टम रिपोर्ट एनालिटिक्स
में
संपादित 3 बनाया:
मैंने महसूस किया कि मैं केवल फ़ाइल नाम और LineNumber भेज रही थी, लेकिन अपवाद नाम और मेरे पैकेज में अपवाद की उत्पत्ति नहीं। मैंने उस जानकारी को भेजने के लिए कोड जोड़कर जवाब में सुधार किया है।
private class AnalyticsExceptionParser implements ExceptionParser {
@Override
public String getDescription(String arg0, Throwable arg1) {
String exceptionDescription = getExceptionInfo(arg1, "", true) + getCauseExceptionInfo(arg1.getCause());
//150 Bytes is the maximum allowed by Analytics for custom dimensions values. Assumed that 1 Byte = 1 Character (UTF-8)
if(exceptionDescription.length() > 150)
exceptionDescription = exceptionDescription.substring(0, 150);
return exceptionDescription;
}
}
//#endregion
//#region PRIVATE METHODS
private String getCauseExceptionInfo(Throwable t) {
String causeDescription = "";
while(t != null && causeDescription.isEmpty()) {
causeDescription = getExceptionInfo(t, "com.myPackageName", false);
t = t.getCause();
}
return causeDescription;
}
private String getExceptionInfo(Throwable t, String packageName, boolean includeExceptionName) {
String exceptionName = "";
String fileName = "";
String lineNumber = "";
for (StackTraceElement element : t.getStackTrace()) {
String className = element.getClassName().toString().toLowerCase();
if(packageName.isEmpty() || (!packageName.isEmpty() && className.contains(packageName))){
exceptionName = includeExceptionName ? t.toString() : "";
fileName = element.getFileName();
lineNumber = String.valueOf(element.getLineNumber());
return exceptionName + "@" + fileName + ":" + lineNumber;
}
}
return "";
}
मुझे एक ही समस्या है। क्या आपको एक समाधान मिला? – Shmuel
@ डेविड मुझे कोई समाधान नहीं मिला। इसलिए मैंने V3 – Anu
का उपयोग नहीं किया, मुझे नहीं पता कि यह आपकी मदद करेगा, लेकिन मुझे लगता है कि मैंने गलती से यह किया है - ga_reportUncaughtException एक स्ट्रिंग जब यह एक बूल होना चाहिए true –
Shmuel