I'm trying to implement in app-billing in my application, but I have a little problem with it. I'm using the example from android developer's site and everytime I start the activity which will connect to the billing service it's showing me a dialog that I cannot connect to server and when I press learn more it's going to a web page which is explaining me to update my android market app, but it's already the latest one. And the other thing, before implementing the code on my application I create a test application where I can connect with the same code and I don't get problems. But in my application I can't do that. Is there any connection with the developer api key, which you can use only in one application or something like that. Because I'm using the same for test and real app.
And here is my code if you can see something which is not really like it should be :
public class StampiiStore extends Activity {
String servername;
int userId;
int storageID;
RPCCommunicator rpc;
String path;
Button envelope1, envelope2, envelope3;
private static final String TAG = "STAMPII";
/**
* The SharedPreferences key for recording whether we initialized the
* database. If false, then we perform a RestoreTransactions request
* to get all the purchases for this user.
*/
private static final String DB_INITIALIZED = "db_initialized";
private mStampiiPurchaseObserver mStampiiPurchaseObserver;
private Handler mHandler;
private BillingService mBillingService;
private TextView mLogTextView;
private Cursor mOwnedItemsCursor;
private PurchaseDatabase mPurchaseDatabase;
private Set<String> mOwnedItems = new HashSet<String>();
/**
* The developer payload that is sent with subsequent
* purchase requests.
*/
private static final int DIALOG_CANNOT_CONNECT_ID = 1;
private static final int DIALOG_BILLING_NOT_SUPPORTED_ID = 2;
#SuppressWarnings("static-access")
#Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.store);
SystemDatabaseHelper sysDbHelper = new SystemDatabaseHelper(this, null, 1);
sysDbHelper.initialize(this);
ImageView icon = (ImageView) findViewById (R.id.store_img);
final int collId = getIntent().getIntExtra("collection_id",0);
Log.e("collId","collId : "+collId);
// Getting all variables from SharedPreferences to build the right path to images
servername = rpc.getCurrentServerName(this);
Log.d("","Current Server Name : "+servername);
userId = rpc.getUserId(this);
Log.d("","User Id : "+userId);
storageID = rpc.getCurrentStoragePath(this);
Log.d("","storage ID : "+storageID);
//
TextView colltitle = (TextView) findViewById(R.id.collection_title);
TextView sTitle = (TextView) findViewById(R.id.store_collId);
TextView collInfo = (TextView) findViewById(R.id.store_coll_info);
envelope1 = (Button) findViewById(R.id.buyone);
envelope1.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
mBillingService.requestPurchase("android.test.purchased", "");
}
});
envelope2 = (Button) findViewById(R.id.buytwo);
envelope2.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
mBillingService.requestPurchase("android.test.canceled", "");
}
});
envelope3 = (Button) findViewById(R.id.buythree);
envelope3.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
mBillingService.requestPurchase("com.stampii.stampii.envelopesthree", "");
}
});
mHandler = new Handler();
mStampiiPurchaseObserver = new mStampiiPurchaseObserver(mHandler);
mBillingService = new BillingService();
mBillingService.setContext(this);
mPurchaseDatabase = new PurchaseDatabase(this);
setupWidgets();
// Check if billing is supported.
ResponseHandler.register(mStampiiPurchaseObserver);
if (!mBillingService.checkBillingSupported()) {
showDialog(DIALOG_CANNOT_CONNECT_ID);
}
Button back = (Button) findViewById(R.id.store_back_button);
back.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
finish();
}
});
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
boolean isLoggedIn = settings.getBoolean("isLoggedIn", false);
ImageButton sync = (ImageButton) findViewById(R.id.sync_store);
if(isLoggedIn){
sync.setVisibility(View.VISIBLE);
} else if(!isLoggedIn){
sync.setVisibility(View.GONE);
}
sync.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent intent = new Intent(StampiiStore.this, Synchronization.class);
intent.putExtra("process", 2);
startActivity(intent);
}
});
String titleSql = "SELECT title FROM collection_lang WHERE collection_id= " + collId + " AND lang_code='en_US'";
Cursor title = sysDbHelper.executeSQLQuery(titleSql);
if(title.getCount()==0){
title.close();
} else if(title.getCount()>0){
for(title.move(0); title.moveToNext(); title.isAfterLast()){
String collectionTitle = title.getString(title.getColumnIndex("title"));
sTitle.setText(collectionTitle);
if (collectionTitle.length() > 20){
String newTitle = collectionTitle.substring(0, 20);
colltitle.setText(newTitle + "...");
} else {
colltitle.setText(collectionTitle);
}
}
}
title.close();
String infoSql = "SELECT DISTINCT c.total_cards AS cardsCount, " +
" c.cards_per_envelope AS cardsPerEnvelope " +
"FROM collections AS c, collection_lang AS cl " +
"WHERE c.collection_id = cl.collection_id AND c.collection_id=" + collId;
Cursor info = sysDbHelper.executeSQLQuery(infoSql);
if(info.getCount()==0){
info.close();
} else if (info.getCount()>0){
info.moveToFirst();
int cardsCount = info.getInt(info.getColumnIndex("cardsCount"));
int cardsPerEnvelope = info.getInt(info.getColumnIndex("cardsPerEnvelope"));
collInfo.setText(cardsCount+" Stampii\n"+cardsPerEnvelope+" cards per envelope");
}
String sqlite2 = "SELECT media_id FROM collection_media WHERE collection_id="+collId+" AND media_type_id="+3018;
Cursor bg = sysDbHelper.executeSQLQuery(sqlite2);
if (bg.getCount() == 0) {
bg.close();
} else if (bg.getCount() > 0) {
for (bg.move(0); bg.moveToNext(); bg.isAfterLast()) {
int objectId = Integer.parseInt(bg.getString(bg.getColumnIndex("media_id")));
String filename = "mediacollection-"+objectId+".png";
//if(storageID==1){
path = rpc.getPublicPathsInternal(servername, 3018, filename, StampiiStore.this);
/*} else if(storageID==2){
path = rpc.getPublicPathsExternal(servername, 3007, objectId);
}*/
}
}
bg.close();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inTempStorage = new byte[3*1024];
Bitmap ops = BitmapFactory.decodeFile(path, options);
BitmapDrawable bitmapDrawable = new BitmapDrawable(ops);
icon.setBackgroundDrawable(bitmapDrawable);
Button promoCode = (Button) findViewById(R.id.promo_code_btn);
promoCode.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
SharedPreferences isSelectedCode = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
String isSelected = isSelectedCode.getString("isSelected", "");
Log.i("isSelected", "isSelected" + isSelected);
EditText input = new EditText(StampiiStore.this);
input.setText(isSelected);
final int loggedOut = getIntent().getIntExtra("statement", 0);
if(loggedOut==0){
new AlertDialog.Builder(getParent())
.setTitle("Promotional Code")
.setView(input)
.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d("AlertDialog", "Positive");
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d("AlertDialog","Negative");
dialog.cancel();
}
}).show();
} else if (loggedOut==1){
new AlertDialog.Builder(Collections.parentActivity)
.setTitle("Promotional Code")
.setView(input)
.setPositiveButton("Confirm", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d("AlertDialog", "Positive");
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d("AlertDialog","Negative");
dialog.cancel();
}
}).show();
}
}
});
Button savedCodes = (Button) findViewById(R.id.saved_codes_btn);
savedCodes.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Intent previewMessage = new Intent(getParent(), SavedCodes.class);
TabGroupActivity parentActivity = (TabGroupActivity)getParent();
parentActivity.startChildActivity("Saved Codes", previewMessage);
}
});
}
/**
* Sets up the UI.
*/
private void setupWidgets() {
//TODO: If need any changes in the UI!
}
/**
* If the database has not been initialized, we send a
* RESTORE_TRANSACTIONS request to Android Market to get the list of purchased items
* for this user. This happens if the application has just been installed
* or the user wiped data. We do not want to do this on every startup, rather, we want to do
* only when the database needs to be initialized.
*/
private void restoreDatabase() {
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
boolean initialized = prefs.getBoolean(DB_INITIALIZED, false);
if (!initialized) {
mBillingService.restoreTransactions();
Toast.makeText(this, "Restoring Transactions", Toast.LENGTH_LONG).show();
}
}
private void prependLogEntry(CharSequence cs) {
SpannableStringBuilder contents = new SpannableStringBuilder(cs);
contents.append('\n');
contents.append(mLogTextView.getText());
mLogTextView.setText(contents);
}
private void logProductActivity(String product, String activity) {
SpannableStringBuilder contents = new SpannableStringBuilder();
contents.append(Html.fromHtml("<b>" + product + "</b>: "));
contents.append(activity);
prependLogEntry(contents);
}
//PurchaseObserver
private class mStampiiPurchaseObserver extends PurchaseObserver {
public mStampiiPurchaseObserver(Handler handler) {
super(StampiiStore.this, handler);
}
#Override
public void onBillingSupported(boolean supported) {
if (Consts.DEBUG) {
Log.i(TAG, "supported: " + supported);
}
if (supported) {
restoreDatabase();
envelope1.setEnabled(true);
envelope2.setEnabled(true);
envelope3.setEnabled(true);
} else {
showDialog(DIALOG_BILLING_NOT_SUPPORTED_ID);
}
}
#Override
public void onPurchaseStateChange(PurchaseState purchaseState, String itemId,
int quantity, long purchaseTime, String developerPayload) {
if (Consts.DEBUG) {
Log.i(TAG, "onPurchaseStateChange() itemId: " + itemId + " " + purchaseState);
}
if (developerPayload == null) {
logProductActivity(itemId, purchaseState.toString());
} else {
logProductActivity(itemId, purchaseState + "\n\t" + developerPayload);
}
if (purchaseState == PurchaseState.PURCHASED) {
mOwnedItems.add(itemId);
}
mOwnedItemsCursor.requery();
}
#Override
public void onRequestPurchaseResponse(RequestPurchase request,
ResponseCode responseCode) {
if (Consts.DEBUG) {
Log.d(TAG, request.mProductId + ": " + responseCode);
}
if (responseCode == ResponseCode.RESULT_OK) {
if (Consts.DEBUG) {
Log.i(TAG, "purchase was successfully sent to server");
}
logProductActivity(request.mProductId, "sending purchase request");
} else if (responseCode == ResponseCode.RESULT_USER_CANCELED) {
if (Consts.DEBUG) {
Log.i(TAG, "user canceled purchase");
}
logProductActivity(request.mProductId, "dismissed purchase dialog");
} else {
if (Consts.DEBUG) {
Log.i(TAG, "purchase failed");
}
logProductActivity(request.mProductId, "request purchase returned " + responseCode);
}
}
#Override
public void onRestoreTransactionsResponse(RestoreTransactions request,
ResponseCode responseCode) {
if (responseCode == ResponseCode.RESULT_OK) {
if (Consts.DEBUG) {
Log.d(TAG, "completed RestoreTransactions request");
}
// Update the shared preferences so that we don't perform
// a RestoreTransactions again.
SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean(DB_INITIALIZED, true);
edit.commit();
} else {
if (Consts.DEBUG) {
Log.d(TAG, "RestoreTransactions error: " + responseCode);
}
}
}
}
/**
* Called when this activity becomes visible.
*/
#Override
protected void onStart() {
super.onStart();
ResponseHandler.register(mStampiiPurchaseObserver);
}
/**
* Called when this activity is no longer visible.
*/
#Override
protected void onStop() {
super.onStop();
ResponseHandler.unregister(mStampiiPurchaseObserver);
}
#Override
protected void onDestroy() {
super.onDestroy();
mPurchaseDatabase.close();
mBillingService.unbind();
}
#Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_CANNOT_CONNECT_ID:
return createDialog("Server cannot Connect",
"Server cannot connect");
case DIALOG_BILLING_NOT_SUPPORTED_ID:
return createDialog("Billing not supported",
"Billing not supported");
default:
return null;
}
}
/**
* Replaces the language and/or country of the device into the given string.
* The pattern "%lang%" will be replaced by the device's language code and
* the pattern "%region%" will be replaced with the device's country code.
*
* #param str the string to replace the language/country within
* #return a string containing the local language and region codes
*/
private String replaceLanguageAndRegion(String str) {
// Substitute language and or region if present in string
if (str.contains("%lang%") || str.contains("%region%")) {
Locale locale = Locale.getDefault();
str = str.replace("%lang%", locale.getLanguage().toLowerCase());
str = str.replace("%region%", locale.getCountry().toLowerCase());
}
return str;
}
private Dialog createDialog(String titleId, String messageId) {
String helpUrl = replaceLanguageAndRegion(getString(R.string.help_url));
if (Consts.DEBUG) {
Log.i(TAG, helpUrl);
}
final Uri helpUri = Uri.parse(helpUrl);
AlertDialog.Builder builder = null;
final int loggedOut = getIntent().getIntExtra("statement", 0);
if(loggedOut==0){
builder = new AlertDialog.Builder(getParent());
builder.setTitle(titleId)
.setIcon(android.R.drawable.stat_sys_warning)
.setMessage(messageId)
.setCancelable(false)
.setPositiveButton(android.R.string.ok, null)
.setNegativeButton("Learn More", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_VIEW, helpUri);
startActivity(intent);
}
});
} else if(loggedOut==1){
builder = new AlertDialog.Builder(Collections.parentActivity);
builder.setTitle(titleId)
.setIcon(android.R.drawable.stat_sys_warning)
.setMessage(messageId)
.setCancelable(false)
.setPositiveButton(android.R.string.ok, null)
.setNegativeButton("Learn More", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Intent.ACTION_VIEW, helpUri);
startActivity(intent);
}
});
}
return builder.create();
}
#Override
public void onRestart(){
super.onRestart();
Intent previewMessage = new Intent(StampiiStore.this, StampiiStore.class);
TabGroupActivity parentActivity = (TabGroupActivity)getParent();
parentActivity.startChildActivity("StampiiStore", previewMessage);
this.finish();
}
}
And here is how I'm declaring the service in manifest file :
<service android:name="BillingService" />
<receiver android:name="BillingReceiver">
<intent-filter>
<action android:name="com.android.vending.billing.IN_APP_NOTIFY" />
<action android:name="com.android.vending.billing.RESPONSE_CODE" />
<action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED" />
</intent-filter>
</receiver>
Any suggestions how to connect to the market?
I had the same issue and probably your mistake is the same as mine. I was using a TabHost in my activities and I find out that TabSpec cannot bind to services. So check this :
Using getApplicationContext().bindService instead of just bindService
on your activity solves the problem as it is using the higher level
application context.
Can't you debug through that code? Probably, mBillingService.checkBillingSupported() returns false, caused by failing BillingService.bindToMarketBillingService().
i was facing problem like that on my sony ericssion w8 2.1 android device
what i did are the following :
1) getApplicationContext().bindService (as android-droid said)
2) reset my mobile and downloaded apk for market 2.3.4 version and installed it
3) then open the market app on mobile and clicked accepted and when the app i quitted
4) rerunned the app it was working fine
note: before doing this i tested my app on other device using market version 3.x and it was working so i did all these things ...
Related
public void book(View c)
{
DoLogin doLogin = new DoLogin();
doLogin.execute("");
finish();
}
public class DoLogin extends AsyncTask<String, String, String> {
String Docdate = docdate.getText().toString().trim();
String Docpre = docprefix.getText().toString().trim();
String Cname = cname.getSelectedItem().toString().trim();
String Product = pname.getSelectedItem().toString().trim();
String Dest = dest.getSelectedItem().toString().trim();
String Dname = dname.getSelectedItem().toString().trim();
String Qty = qty.getText().toString().trim();
String Remarks = remarks.getText().toString().trim();
String Duedt = duedt.getText().toString().trim();
#Override
protected void onPreExecute() {
}
#Override
protected void onPostExecute(String r) {
Toast.makeText(OrderEntry.this, r, Toast.LENGTH_SHORT).show();
if (isSuccess) {
final AlertDialog.Builder alertDialogBuilder = new
AlertDialog.Builder(mContext);
alertDialogBuilder.setMessage("Would You like to Confirm
Your Order?");
alertDialogBuilder.setPositiveButton("yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int
arg1) {
try {
rs1 = stmt.executeQuery(Qr);
if (rs1.next()) {
Toast.makeText(mContext,
"hiiiiiiiiiiiiii", Toast.LENGTH_SHORT).show();
Intent i = new
Intent(OrderEntry.this, OrderRequest.class);
startActivity(i);
} else {
Toast.makeText(mContext,
"byeeeeeeeeeeeee", Toast.LENGTH_SHORT).show();
}
} catch (Exception v) {
Log.e("insert", v + "");
}
}
});
alertDialogBuilder.setNegativeButton("No", new
DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
alertDialog.cancel();
isSuccess1 = false;
}
});
alertDialog = alertDialogBuilder.create();
alertDialog.setCanceledOnTouchOutside(false);
alertDialog.show();
}
}
protected String doInBackground(String... params) {
try {
Connection conn = (Connection) connectionClass.CONN();
if (conn == null) {
z = "Error in connection with SQL server";
} else {
Qr = "insert into [Dealer].[dbo].[BookingOrder]
(DocDate,DocPrefix,CustomerName,Destination,
DealerName,Productname,Quantity,Remarks,DueDate)
values('" + Docdate + "','" + Docpre + "','" + Cname + "',
'" + Dest + "','" + Dname + "','" + Product + "','"
+ Qty + "','" + Remarks + "','" + Duedt + "')";
stmt = conn.createStatement();
z = "confirmation";
isSuccess = true;
}
} catch (Exception ex) {
isSuccess = false;
Log.e("con", ex + "");
}
}
return z;
}
}
> LOGCAT ERRORS:
/WindowManager: android.view.WindowLeaked: Activity
com.example.admin.dealerdemo.OrderEntry has leaked window
com.android.internal.policy.PhoneWindow$DecorView{dba0674
V.E...... R.....I. 0,0-639,188} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:368)
at
android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299)
at
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
at android.app.Dialog.show(Dialog.java:319)
at
com.example.admin.dealerdemo.OrderEntry$DoLogin$override.
onPostExecute(OrderEntry.java:295)
at
com.example.admin.dealerdemo.OrderEntry$DoLogin$override.
access$dispatch(OrderEntry.java)
at com.example.admin.dealerdemo.OrderEntry$DoLogin.
onPostExecute(OrderEntry.java:0)
at com.example.admin.dealerdemo.OrderEntry$DoLogin
.onPostExecute(OrderEntry.java:231)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at
android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at
android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.
run(ZygoteInit.java:726)
at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
I have to Confirm the order before clicking on (book :Method)Book your Order button.I am getting above exception.How can I handle this exception ?Please help me to overcome this problem.Thanks in Advance.
Cancel the current alertDialog before start another Activity. call alertDialog.dismiss()
#Override
protected void onPostExecute(String r) {
Toast.makeText(OrderEntry.this, r, Toast.LENGTH_SHORT).show();
if (isSuccess) {
final AlertDialog.Builder alertDialogBuilder = new
AlertDialog.Builder(mContext);
alertDialogBuilder.setMessage("Would You like to Confirm
Your Order?");
alertDialogBuilder.setPositiveButton("yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int
arg1) {
try {
alertDialog.dismiss();
rs1 = stmt.executeQuery(Qr);
if (rs1.next()) {
Toast.makeText(mContext,
"hiiiiiiiiiiiiii", Toast.LENGTH_SHORT).show();
Intent i = new
Intent(OrderEntry.this, OrderRequest.class);
startActivity(i);
} else {
alertDialog.dismiss();
Toast.makeText(mContext,
"byeeeeeeeeeeeee", Toast.LENGTH_SHORT).show();
}
} catch (Exception v) {
Log.e("insert", v + "");
}
}
});
alertDialogBuilder.setNegativeButton("No", new
DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
isSuccess1 = false;
}
});
alertDialog = alertDialogBuilder.create();
alertDialog.setCanceledOnTouchOutside(false);
alertDialog.show();
}
You need to post the code from your doInBackground method as well. It is possible that your activity is somehow exited during that method, so trying to create an AlertDialog from "mContext" (whatever that is, show the rest of your code) causes a window leak.
This other question may have what you need: Activity has leaked window that was originally added
The problem is likely that you need to dismiss() your AlertDialog before changing/leaving activities, or you need to make sure the activity is active before you create it.
I am trying to retrieve user email from Users and then use it to get data from other firebase database nodes like the Shared_With node. But for some odd reason I am getting Null pointer exceptions. I have no idea why email is either not being retrieved or being set to null. Here is my class where I am doing all of this:
private static Context context = null;
//new name for android devices
private EditText result;
FirebaseAuth auth = FirebaseAuth.getInstance();
static SharedPreferences deviceListSharedPreferences;
//widgets
// Button btnPaired;
static ListView devicelist;
static ImageView iv;
private static DBHandler mdb;
private static Set<BluetoothDevice> pairedDevices;
String name;
static String pass;
private String mEmail;
String emaill;
String mNameRec;
String mPassRec;
String mMacRec;
private static BluetoothAdapter myBluetooth = null;
static TextView mName;
static TextView mMac;
static TextView mNameRecDev;
static TextView mMacRecDev;
private static ProgressDialog progress;
private static String address = "";
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
User userModel = new User();
private static final String TAG ="USER STATUS" ;
private OnFragmentInteractionListener mListener;
static BluetoothSocket btSocket = null;
private static boolean isBtConnected = false;
//SPP UUID. Look for it
static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private String encPass;
String decPass;
/*Class begins here, other methods omitted due to charectar limit*/
public main() {
}
#Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
iv = (ImageView) view.findViewById(R.id.change);
//Calling widgets
// // btnPaired = (Button) view.findViewById(R.id.button);
devicelist = (ListView) view.findViewById(R.id.listView);
mNameRecDev = (TextView)view.findViewById(R.id.nameRec);
mMacRecDev = (TextView)view.findViewById(R.id.macRec);
try {
emaill = mAuth.getCurrentUser().getEmail();
emaill = emaill.replace(".", "<");
System.out.println("Email add:" + emaill);
}catch(NullPointerException n){
System.out.println(n.getMessage());
}
if (myBluetooth.isEnabled()) { // bluetooth is connected
pairedDevicesList();
}
iv.setEnabled(false);
iv.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// Get the device MAC address, the last 17 chars in the View
String device_name = deviceListSharedPreferences.getString(address, mdb.getDeviceName(address));
if (v.getContentDescription().toString().equals("green")) {
iv.setImageResource(R.drawable.red);
mdb.addLog(new SimpleDateFormat("HH:mm:ss, dd/MM/yyyy").format(new Date().getTime())
+ "", MainActivity.name, MainActivity.email, device_name, "0");
iv.setContentDescription("red");
try{
sendCommand("~"+pass);
}catch(NullPointerException e){
Toast.makeText(getContext(), "Set password first", Toast.LENGTH_SHORT);
}//method to turn on
} else {
iv.setImageResource(R.drawable.green);
mdb.addLog(new SimpleDateFormat("HH:mm:ss, dd/MM/yyyy").format(new Date().getTime())
+ "", MainActivity.name, MainActivity.email, device_name, "1");
iv.setContentDescription("green");
try{
sendCommand("`"+pass);
}catch(NullPointerException e){
Toast.makeText(getContext(), "Set password first", Toast.LENGTH_SHORT);
}//method to turn off
}
}
});
System.out.println(emaill+"HEH");
DatabaseReference mdShare = FirebaseDatabase.getInstance().getReference().child("Shared_With");
mdShare.child(emaill).addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
mNameRec = dataSnapshot.child("Device_Name").getValue().toString();
mMacRec = dataSnapshot.child("Device_MAC").getValue().toString();
mPassRec = dataSnapshot.child("Password").getValue().toString();
decPassrd(mPassRec);
mNameRecDev.setText(mNameRec);
mMacRecDev.setText(mMacRec);
}
#Override
public void onCancelled(DatabaseError databaseError) {
}
});
//
mNameRecDev.setOnClickListener(this);
mMacRecDev.setOnClickListener(this);
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
#Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
BluetoothAdapter.ERROR);
switch (state) {
case BluetoothAdapter.STATE_OFF:
Toast.makeText(getActivity(), "Bluetooth needs to be on", Toast.LENGTH_LONG).show();
break;
// case BluetoothAdapter.STATE_TURNING_OFF:
// do something if needed
// break;
case BluetoothAdapter.STATE_ON:
// pairedDevicesList();
break;
// case BluetoothAdapter.STATE_TURNING_ON:
// do something if needed
// break;
}
}
}
};
private static class ConnectBT extends AsyncTask<Void, Void, Void> // UI thread
{
private boolean ConnectSuccess = true; //if it's here, it's almost connected
#Override
protected void onPreExecute() {
progress = ProgressDialog.show(context, "Connecting...", "Please wait!!!"); //show a progress dialog
}
// if(iterator.getAddress().equals(DEVICE_ADDRESS)) //Replace with iterator.getName() if comparing Device names.
//
// {
//
// device=iterator; //device is an object of type BluetoothDevice
//
// found=true;
// socket = device.createRfcommSocketToServiceRecord(PORT_UUID); socket.connect();
#Override
protected Void doInBackground(Void... devices) //while the progress dialog is shown, the connection is done in background
{
try {
if (btSocket == null || !isBtConnected) {
myBluetooth = BluetoothAdapter.getDefaultAdapter();//get the mobile bluetooth device
BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address);//connects to the device's address and checks if it's available
// btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(UUID.fromString(dispositivo.getUuids()[0].toString()));//create a RFCOMM (SPP) connection
btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID);//create a RFCOMM (SPP) connection
BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
btSocket.connect();//start connection
}
} catch (IOException e) {
e.printStackTrace();
ConnectSuccess = false;//if the try failed, you can check the exception here
}
return null;
}
#Override
protected void onPostExecute(Void result) //after the doInBackground, it checks if everything went fine
{
super.onPostExecute(result);
if (!ConnectSuccess) {
Toast.makeText(context, "Connection Failed. Are you sure the device is in range and on, or another device is not connected already?", Toast.LENGTH_LONG).show();
} else {
//Ahmed: BLUETOOTH IS CONNECTED
iv.setEnabled(true);
Toast.makeText(context, "Connected.", Toast.LENGTH_SHORT).show();
try{
sendTimedCommand("^"+pass);
}catch(NullPointerException e){
Toast.makeText(context, "Set password first", Toast.LENGTH_SHORT);
}//tell arduino device is connected //
isBtConnected = true;
}
progress.dismiss();
}
}
public static ArrayList list = new ArrayList();
public static void pairedDevicesList() {
pairedDevices = myBluetooth.getBondedDevices();
list.clear();
if (pairedDevices.size() > 0) {
for (BluetoothDevice bt : pairedDevices) { //loop
// handling custom names for devices, address => custom name
// reading already stored custom names
String customName;
// Toast.makeText(getActivity(), bt.getAddress() + " => " + bt.getName(), Toast.LENGTH_LONG).show(); //annoying
if (mdb.getDeviceName(bt.getAddress()).length() < 2) {
customName = deviceListSharedPreferences.getString(bt.getAddress(), bt.getName() + "\n" + bt.getAddress());
}
else {
customName = deviceListSharedPreferences.getString(bt.getAddress(), mdb.getDeviceName(bt.getAddress()));
}
list.add(customName); //add the appropriate name to ListView
SharedPreferences.Editor editor = listIndexToDeviceAddress.edit();
editor.putString(String.valueOf(list.size() - 1), bt.getAddress()); // puts position => address
editor.commit();
}
} else {
Toast.makeText(context, "No Paired Bluetooth Devices Found.", Toast.LENGTH_LONG).show();
}
final ArrayAdapter adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, list);
devicelist.setAdapter(adapter);
devicelist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
address = listIndexToDeviceAddress.getString(String.valueOf(position), "address not available");
if (address.equals("address not available")){
Toast.makeText(context, "Something went wrong, address not found", Toast.LENGTH_LONG).show();
}else {
new ConnectBT().execute(); //Call the class to connect
}
}
}); //Method called when the device from the list is clicked
//handling long click
devicelist.setOnItemLongClickListener (new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView parent,final View view, final int position, long id) {
// TODO Auto-generated method stub
android.support.v7.app.AlertDialog.Builder builderSingle = new android.support.v7.app.AlertDialog.Builder(context);
// can be used for icon and label:
//builderSingle.setIcon(R.drawable.ic_logo);
// builderSingle.setTitle("Select One Name:-");
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(context, android.R.layout.select_dialog_singlechoice);
// hardcoded options
arrayAdapter.add("Enter New Name");
arrayAdapter.add("Set Password");
builderSingle.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builderSingle.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
String strName = arrayAdapter.getItem(which);
if (which == 0){ // delete
//do your stuff here
// get prompts.xml view
LayoutInflater li = LayoutInflater.from(context);
View promptsView = li.inflate(R.layout.name_prompt, null);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
context);
// set prompts.xml to alertdialog builder
alertDialogBuilder.setView(promptsView);
final EditText userInput = (EditText) promptsView
.findViewById(R.id.editTextDialogUserInput);
// set dialog message
alertDialogBuilder
.setCancelable(false)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// get user input and set it to result
// edit text
Log.d("length", String.valueOf(userInput.getText().toString().length()));
if (userInput.getText().toString().length() > 0) {
SharedPreferences.Editor editor = deviceListSharedPreferences.edit();
String device_address = listIndexToDeviceAddress.getString(String.valueOf(position), "address not available");
if (!device_address.equals("address not available")) {
editor.putString(device_address, userInput.getText().toString());
editor.commit();
pairedDevicesList();
Toast.makeText(context, "Saved", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(context, "Name empty", Toast.LENGTH_SHORT).show();
}
}
})
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}else if (which == 1){ // share
//do your stuff here
// get prompts.xml view
LayoutInflater li = LayoutInflater.from(context);
View promptsView = li.inflate(R.layout.name_prompt, null);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
context);
// set prompts.xml to alertdialog builder
alertDialogBuilder.setView(promptsView);
final TextView tv = (TextView) promptsView.findViewById(R.id.name_prompt_label);
tv.setText("Enter New Password");
final EditText userInput = (EditText) promptsView
.findViewById(R.id.editTextDialogUserInput);
// set dialog message
alertDialogBuilder
.setCancelable(false)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// get user input and set it to result
// set password
Log.d("length", String.valueOf(userInput.getText().toString().length()));
if (userInput.getText().toString().length() > 0) {
// are you sure this is the new password?
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
//Yes button clicked
// update or create new password
String device_address = listIndexToDeviceAddress.getString(String.valueOf(position), "address not available");
String device_name = deviceListSharedPreferences.getString(device_address, ((String)devicelist.getItemAtPosition(position)).split("\n")[0]); //get saved name otherwise get first line from ListView string
if (!device_address.equals("address not available")) {
Log.v("address and name", device_address);
mdb.updateOrSetNewPassword(device_name, device_address, userInput.getText().toString(), true);
Toast.makeText(context, "New Password Set", Toast.LENGTH_SHORT).show();
}
dialog.dismiss();
break;
case DialogInterface.BUTTON_NEGATIVE:
//No button clicked
dialog.dismiss();
break;
}
}
};
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(context);
builder.setMessage("Are you sure you want to change the password to " + userInput.getText().toString() + "?").setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
} else {
Toast.makeText(context, "Password field empty empty", Toast.LENGTH_SHORT).show();
}
}
})
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
}
}
});
builderSingle.show();
return true;
}
});
}
}
Here is my Logcat:
logcat1
logcat2
Here is my database structure:
You forgot to initialize your mAuth
mAuth = FirebaseAuth.getInstance();
This will make emaill null
I suspect emaill is empty or null in this statement:
mdShare.child(emaill).addValueEventListener(new ValueEventListener() {...}
Look at your log output to see what is logged for these statements:
System.out.println("Email add:" + emaill);
...
System.out.println(emaill+"HEH");
Also look at the output from these statements. Perhaps there is no signed-in user, so getCurrentUser() is returning null. It is also possible that there is a user, but there is no email address in his/her profile. And as #Indra correctly points out, you haven't initialized mAuth.
try {
emaill = mAuth.getCurrentUser().getEmail();
emaill = emaill.replace(".", "<");
System.out.println("Email add:" + emaill);
}catch(NullPointerException n){
System.out.println(n.getMessage());
}
I'm new to Android and I'm trying to attach a contact picker to a form. This "contact picker code" works well when I test it with other forms but with this form, the resultCode = RESULT_CANCELED. I have checked other examples, but it doesn't work with this from but still works with other forms.
public class EmergencyButtonActivity extends Activity {
static private MoreEditText mPhonesMoreEditText = null;
private static final String DEBUG_TAG = "EmergencyButtonActivity";
private static final int CONTACT_PICKER_RESULT = 1001;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ExceptionHandler.register(this, new StackMailer());
setContentView(R.layout.main);
}
public void doLaunchContactPicker(View view) {
Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
Contacts.CONTENT_URI);
startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT);
}
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case CONTACT_PICKER_RESULT:
Cursor cursor = null;
String phone = "";
try {
Uri result = data.getData();
Log.v(DEBUG_TAG, "Got a contact result: "
+ result.toString());
// get the contact id from the Uri
String id = result.getLastPathSegment();
// query for everything email
cursor = getContentResolver().query(Phone.CONTENT_URI,
null, Phone.CONTACT_ID + "=?", new String[] { id },
null);
int emailIdx = cursor.getColumnIndex(Phone.DATA);
// let's just get the first phone
if (cursor.moveToFirst()) {
phone = cursor.getString(emailIdx);
Log.v(DEBUG_TAG, "Got email: " + phone);
} else {
Log.w(DEBUG_TAG, "No results");
}
} catch (Exception e) {
Log.e(DEBUG_TAG, "Failed to get email data", e);
} finally {
if (cursor != null) {
cursor.close();
}
EditText txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo);
txtPhoneNo.setText(phone);
if (phone.length() == 0) {
Toast.makeText(this, "No number found for contact.",
Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(getBaseContext(), "Phone : "+ phone, Toast.LENGTH_LONG).show();
}
}
break;
}
} else {
Log.w(DEBUG_TAG, "Warning: activity result not ok");
}
}
private void popup(String title, String text) {
AlertDialog.Builder builder = new AlertDialog.Builder(EmergencyButtonActivity.this);
builder.setMessage(text)
.setTitle(title)
.setCancelable(true)
.setPositiveButton("ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
private void initUI() {
setContentView(R.layout.main);
this.restoreTextEdits();
ImageButton btnEmergency = (ImageButton) findViewById(R.id.btnEmergency);
btnEmergency.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// try sending the message:
EmergencyButtonActivity.this.redButtonPressed();
}
});
ImageButton btnHelp = (ImageButton) findViewById(R.id.btnHelp);
btnHelp.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
popupHelp();
}
});
}
public void popupHelp() {
final String messages [] = {
"Welcome To App xxxxxx",
"XXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXX."
};
// inverted order - They all popup and you hit "ok" to see the next one.
popup("3/3", messages[2]);
popup("2/3", messages[1]);
popup("1/3", messages[0]);
}
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
initUI();
}
private class StackMailer implements ExceptionHandler.StackTraceHandler {
public void onStackTrace(String stackTrace) {
EmailSender.send("a#zzz.com", "Error", "ButtonError\n" + stackTrace);
}
}
#Override
protected void onStart()
{
super.onStart();
}
#Override
protected void onResume()
{
super.onResume();
initUI();
//IntroActivity.openOnceAfterInstallation(this);
helpOnceAfterInstallation();
}
#Override
protected void onPause() {
super.onPause();
this.saveTextEdits();
}
#Override
protected void onStop() {
super.onStop();
}
public void helpOnceAfterInstallation() {
// runs only on the first time opening
final String wasOpenedName = "wasOpened";
final String introDbName = "introActivityState";
SharedPreferences settings = this.getSharedPreferences(introDbName, Context.MODE_PRIVATE);
boolean wasOpened = settings.getBoolean(wasOpenedName, false);
if (wasOpened) {
return;
}
// mark that it was opened once
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(wasOpenedName, true);
editor.commit();
popupHelp();
}
private class EditTextRow {
LinearLayout mLinlay;
EditText mEditText;
ImageButton mRemoveBtn;
public EditTextRow(String text, EditText example) {
mEditText = new EditText(EmergencyButtonActivity.this);
mEditText.setLayoutParams(example.getLayoutParams());
mEditText.setText(text);
mEditText.setInputType(example.getInputType());
mRemoveBtn = new ImageButton(EmergencyButtonActivity.this);
mRemoveBtn.setBackgroundResource(R.drawable.grey_x);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
mRemoveBtn.setLayoutParams(params);
mLinlay = new LinearLayout(EmergencyButtonActivity.this);
mLinlay.setOrientation(LinearLayout.HORIZONTAL);
mLinlay.addView(mEditText);
mLinlay.addView(mRemoveBtn);
}
}
private class MoreEditText {
private LinearLayout mContainer;
private ArrayList<EditText> mEditTextList = null;
public MoreEditText(LinearLayout container, EditText textWidget, List<String> stringsList) {
// Create the rows from scratch, this should only happen onCreate
mContainer = container;
mEditTextList = new ArrayList<EditText>();
EditText edit;
edit = textWidget;
if(! stringsList.isEmpty()) {
edit.setText(stringsList.get(0));
}
mEditTextList.add(edit);
for (int i = 1; i < stringsList.size(); i++) {
addRow(stringsList.get(i));
}
}
public void restore(LinearLayout container, EditText textWidget, List<String> stringsList) {
// Create the rows from older existing rows, this can happen on
// changes of orientation, onResume, etc
mContainer = container;
for(int i = 0; i < mEditTextList.size(); i++) {
EditText edit;
if (i == 0) {
edit = textWidget;
mEditTextList.set(0, edit);
if (stringsList.size() > 0) {
edit.setText(stringsList.get(0));
}
} else {
edit = mEditTextList.get(i);
View viewRow = (LinearLayout) edit.getParent();
((LinearLayout)viewRow.getParent()).removeView(viewRow);
mContainer.addView(viewRow);
}
}
}
#SuppressWarnings("unused")
public EditText getDefaultTextEdit(LinearLayout container) {
// TODO: turn this into something like "getEditTextChild" rather than counting on the index "0"
return (EditText) ((LinearLayout)container.getChildAt(0)).getChildAt(0);
}
public void removeRow(EditText editText) {
mContainer.removeView((View) editText.getParent());
mEditTextList.remove(editText);
}
public void addRow(String text) {
final EditTextRow editRow = new EditTextRow(text, mEditTextList.get(0));
editRow.mRemoveBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MoreEditText.this.removeRow(editRow.mEditText);
}
});
mContainer.addView(editRow.mLinlay);
mEditTextList.add(editRow.mEditText);
}
public List<String> GetTexts() {
ArrayList<String> texts = new ArrayList<String>();
for (int i = 0; i < mEditTextList.size(); i ++) {
texts.add(mEditTextList.get(i).getText().toString());
}
return texts;
}
}
private void addPhonesEmailsUI(List<String> phones, List<String> emails) {
LinearLayout phoneNoLin = (LinearLayout)findViewById(R.id.linPhoneNo);
EditText txtPhoneNo = (EditText)findViewById(R.id.txtPhoneNo);
// NOTE: we don't always create from scratch so that empty textboxes
// aren't erased on changes of orientation.
if (mPhonesMoreEditText == null) {
mPhonesMoreEditText = new MoreEditText(phoneNoLin, txtPhoneNo, phones);
} else {
mPhonesMoreEditText.restore(phoneNoLin, txtPhoneNo, phones);
}
}
public void restoreTextEdits() {
EmergencyData emergencyData = new EmergencyData(this);
addPhonesEmailsUI(emergencyData.getPhones(), emergencyData.getEmails());
EditText txtMessage = (EditText) findViewById(R.id.txtMessage);
txtMessage.setText(emergencyData.getMessage());
}
#SuppressWarnings("unused")
public void saveTextEdits() {
EditText txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo);
EditText txtMessage = (EditText) findViewById(R.id.txtMessage);
EmergencyData emergencyData = new EmergencyData(this);
emergencyData.setPhones(mPhonesMoreEditText.GetTexts());
emergencyData.setMessage(txtMessage.getText().toString());
}
public void redButtonPressed() {
this.saveTextEdits();
EmergencyData emergency = new EmergencyData(this);
if ((emergency.getPhones().size() == 0) && (emergency.getEmails().size() == 0)) {
Toast.makeText(this, "Enter a phone number or email.",
Toast.LENGTH_SHORT).show();
return;
}
EmergencyActivity.armEmergencyActivity(this);
Intent myIntent = new Intent(EmergencyButtonActivity.this, EmergencyActivity.class);
EmergencyButtonActivity.this.startActivity(myIntent);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.ebutton_menu, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent i = new Intent(Intent.ACTION_VIEW);
switch (item.getItemId()) {
case R.id.project_page:
i.setData(Uri.parse("http://#/"));
startActivity(i);
break;
case R.id.credits:
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.credits_dialog);
dialog.setTitle("Credits");
TextView text = (TextView) dialog.findViewById(R.id.textView);
try {
Resources res = getResources();
InputStream in_s = res.openRawResource(R.raw.credits);
byte[] b = new byte[in_s.available()];
in_s.read(b);
text.setText(new String(b));
} catch (Exception e) {
// e.printStackTrace();
text.setText("Error: can't show credits.");
}
dialog.show();
break;
}
return true;
}
}
Finally found a solution, the problem was with the android:launchMode in the manifest.
I have been trying to add licensing support to my app and I am not getting any errors, however the logcat says it is checking the license but it doesn't do anything in the app. When the app opens up, the first thing it does is check the license. The last logcat entry I get is, "Received Response" and "Clearing timeout". None of the actual handling I have set up to do certain things if the response is NOT_LICENSED or LICENSED happens, which I have set up to log. It is probably some glaring issue that I haven't seen as I am a newer developer. Yes I have the library imported correctly.
public class MainActivity extends ListActivity {
public static final String PREFS_NAME = "MyPrefsFile";
private ArrayAdapter<String> adapter;
private ListView list;
private Context c = this;
boolean home;
boolean school;
boolean licensed = false;
boolean didCheck = false;
boolean checkingLicense = false;
SharedPreferences userIsLicensed=null;
#SuppressWarnings("deprecation")
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
userIsLicensed = getSharedPreferences(PREFS_NAME, 0);
licensed = userIsLicensed.getBoolean("licensed", false);
Toast.makeText(this, "Checking application license...", Toast.LENGTH_SHORT).show();
// Check the license
checkLicense();
//License Checking Part
String BASE64_PUBLIC_KEY = "KEY";
LicenseCheckerCallback mLicenseCheckerCallback;
LicenseChecker mChecker;
Handler mHandler;
// REPLACE WITH YOUR OWN SALT , THIS IS FROM EXAMPLE
private final byte[] SALT = new byte[]{BYTES};
private void displayResult(final String result) {
mHandler.post(new Runnable() {
public void run() {
setProgressBarIndeterminateVisibility(false);
}
});
}
protected void doCheck() {
didCheck = false;
checkingLicense = true;
setProgressBarIndeterminateVisibility(true);
mChecker.checkAccess(mLicenseCheckerCallback);
}
protected void checkLicense() {
Log.i("LICENSE", "checkLicense");
mHandler = new Handler();
// Try to use more data here. ANDROID_ID is a single point of attack.
String deviceId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
// Library calls this when it's done.
mLicenseCheckerCallback = new MyLicenseCheckerCallback();
// Construct the LicenseChecker with a policy.
mChecker = new LicenseChecker(
this, new ServerManagedPolicy(this,
new AESObfuscator(SALT, getPackageName(), deviceId)),
BASE64_PUBLIC_KEY);
doCheck();
}
protected class MyLicenseCheckerCallback implements LicenseCheckerCallback {
public void allow() {
if (isFinishing()) {
// Don't update UI if Activity is finishing.
return;
}
Log.i("License","Accepted!");
// Should allow user access.
displayResult(getString(R.string.allow));
licensed = true;
checkingLicense = false;
didCheck = true;
SharedPreferences.Editor editor = userIsLicensed.edit();
editor.putBoolean("licensed", true);
editor.commit();
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}
#SuppressWarnings("deprecation")
public void dontAllow() {
if (isFinishing()) {
// Don't update UI if Activity is finishing.
return;
}
Log.i("License","Denied!");
displayResult(getString(R.string.dont_allow));
licensed = false;
// Should not allow access. In most cases, the app should assume
// the user has access unless it encounters this. If it does,
// the app should inform the user of their unlicensed ways
// and then either shut down the app or limit the user to a
// restricted set of features.
// In this example, we show a dialog that takes the user to Market.
checkingLicense = false;
didCheck = true;
SharedPreferences.Editor editor = userIsLicensed.edit();
editor.putBoolean("licensed", false);
editor.commit();
showDialog(0);
}
#SuppressWarnings("deprecation")
public void applicationError(ApplicationErrorReport errorCode) {
Log.i("LICENSE", "error: " + errorCode);
if (isFinishing()) {
// Don't update UI if Activity is finishing.
return;
}
licensed = false;
// This is a polite way of saying the developer made a mistake
// while setting up or calling the license checker library.
// Please examine the error code and fix the error.
#SuppressWarnings("unused")
String result = String.format(getString(R.string.application_error), errorCode);
checkingLicense = false;
didCheck = true;
//displayResult(result);
showDialog(0);
}
#Override
public void allow(int reason) {
// TODO Auto-generated method stub
}
#Override
public void dontAllow(int reason) {
// TODO Auto-generated method stub
}
#Override
public void applicationError(int errorCode) {
// TODO Auto-generated method stub
}
}
protected Dialog onCreateDialog(int id) {
// We have only one dialog.
return new AlertDialog.Builder(this)
.setTitle(R.string.unlicensed_dialog_title)
.setMessage(R.string.unlicensed_dialog_body)
.setPositiveButton(R.string.buy_button, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(
"http://market.android.com/details?id=" + getPackageName()));
startActivity(marketIntent);
finish();
}
})
.setNegativeButton(R.string.quit_button, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setCancelable(false)
.setOnKeyListener(new DialogInterface.OnKeyListener(){
public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) {
Log.i("License", "Key Listener");
finish();
return true;
}
})
.create();
}
Well I finally figured it out, I had to override allow() and dontAllow() to get it to work!
I am using SIPDEMO application . when i am login by username , domain, and password . it give me "Registration fail error" ..
I have checked in my iphone and working well . so there is not any problem in my sip accounts.
i have also read the completed code but unable to find any error
please expert help me
this is code:-
public class WalkieTalkieActivity extends Activity implements View.OnTouchListener {
public String sipAddress = null;
public SipManager manager = null;
public SipProfile me = null;
public SipAudioCall call = null;
public IncomingCallReceiver callReceiver;
private static final int CALL_ADDRESS = 1;
private static final int SET_AUTH_INFO = 2;
private static final int UPDATE_SETTINGS_DIALOG = 3;
private static final int HANG_UP = 4;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.walkietalkie);
ToggleButton pushToTalkButton = (ToggleButton) findViewById(R.id.pushToTalk);
pushToTalkButton.setOnTouchListener(this);
// Set up the intent filter. This will be used to fire an
// IncomingCallReceiver when someone calls the SIP address used by this
// application.
IntentFilter filter = new IntentFilter();
filter.addAction("android.SipDemo.INCOMING_CALL");
callReceiver = new IncomingCallReceiver();
this.registerReceiver(callReceiver, filter);
// "Push to talk" can be a serious pain when the screen keeps turning off.
// Let's prevent that.
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
initializeManager();
}
#Override
public void onStart() {
super.onStart();
// When we get back from the preference setting Activity, assume
// settings have changed, and re-login with new auth info.
initializeManager();
}
#Override
public void onDestroy() {
super.onDestroy();
if (call != null) {
call.close();
}
closeLocalProfile();
if (callReceiver != null) {
this.unregisterReceiver(callReceiver);
}
}
public void initializeManager() {
if(manager == null) {
manager = SipManager.newInstance(this);
Log.v("sip_test", "manager: " + manager.toString());
Log.v("sip_test", "isApiSupported: " + new Boolean(SipManager.isApiSupported(this)).toString());
Log.v("sip_test", "isSipWifiOnly: " + new Boolean(SipManager.isSipWifiOnly(this)).toString());
Log.v("sip_test", "isVoipSupported: " + new Boolean(SipManager.isVoipSupported(this)).toString());
}
initializeLocalProfile();
}
/**
* Logs you into your SIP provider, registering this device as the location to
* send SIP calls to for your SIP address.
*/
public void initializeLocalProfile() {
if (manager == null) {
return;
}
if (me != null) {
closeLocalProfile();
}
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
String username = prefs.getString("namePref", "");
String domain = prefs.getString("domainPref", "");
String password = prefs.getString("passPref", "");
System.out.println("username " +username);
System.out.println("domain " +domain);
System.out.println("password " +password);
if (username.length() == 0 || domain.length() == 0 || password.length() == 0) {
showDialog(UPDATE_SETTINGS_DIALOG);
return;
}
try {
SipProfile.Builder builder = new SipProfile.Builder(username, domain);
builder.setPassword(password);
me = builder.build();
Intent i = new Intent();
i.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA);
manager.open(me, pi, null);
// This listener must be added AFTER manager.open is called,
// Otherwise the methods aren't guaranteed to fire.
manager.setRegistrationListener(me.getUriString(), new SipRegistrationListener() {
public void onRegistering(String localProfileUri) {
updateStatus("Registering with SIP Server...");
}
public void onRegistrationDone(String localProfileUri, long expiryTime) {
updateStatus("Ready");
}
public void onRegistrationFailed(String localProfileUri, int errorCode,
String errorMessage) {
updateStatus("Registration failed. Please check settings.");
System.out.println("local profile uri " + localProfileUri);
System.out.println("error code" + errorCode);
System.out.println("error message " +errorMessage);
}
});
} catch (ParseException pe) {
updateStatus("Connection Error.");
System.out.println("parse exception"+pe.getMessage());
} catch (SipException se) {
updateStatus("Connection error.");
System.out.println("Connection exception"+se.getMessage());
}
}
/**
* Closes out your local profile, freeing associated objects into memory
* and unregistering your device from the server.
*/
public void closeLocalProfile() {
if (manager == null) {
return;
}
try {
if (me != null) {
manager.close(me.getUriString());
}
} catch (Exception ee) {
Log.d("WalkieTalkieActivity/onDestroy", "Failed to close local profile.", ee);
}
}
/**
* Make an outgoing call.
*/
public void initiateCall() {
updateStatus(sipAddress);
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
// Much of the client's interaction with the SIP Stack will
// happen via listeners. Even making an outgoing call, don't
// forget to set up a listener to set things up once the call is established.
#Override
public void onCallEstablished(SipAudioCall call) {
call.startAudio();
call.setSpeakerMode(true);
call.toggleMute();
updateStatus(call);
}
#Override
public void onCallEnded(SipAudioCall call) {
updateStatus("Ready.");
}
};
call = manager.makeAudioCall(me.getUriString(), sipAddress, listener, 30);
}
catch (Exception e) {
Log.i("WalkieTalkieActivity/InitiateCall", "Error when trying to close manager.", e);
if (me != null) {
try {
manager.close(me.getUriString());
} catch (Exception ee) {
Log.i("WalkieTalkieActivity/InitiateCall",
"Error when trying to close manager.", ee);
ee.printStackTrace();
}
}
if (call != null) {
call.close();
}
}
}
/**
* Updates the status box at the top of the UI with a messege of your choice.
* #param status The String to display in the status box.
*/
public void updateStatus(final String status) {
// Be a good citizen. Make sure UI changes fire on the UI thread.
this.runOnUiThread(new Runnable() {
public void run() {
TextView labelView = (TextView) findViewById(R.id.sipLabel);
labelView.setText(status);
}
});
}
/**
* Updates the status box with the SIP address of the current call.
* #param call The current, active call.
*/
public void updateStatus(SipAudioCall call) {
String useName = call.getPeerProfile().getDisplayName();
if(useName == null) {
useName = call.getPeerProfile().getUserName();
}
updateStatus(useName + "#" + call.getPeerProfile().getSipDomain());
}
/**
* Updates whether or not the user's voice is muted, depending on whether the button is pressed.
* #param v The View where the touch event is being fired.
* #param event The motion to act on.
* #return boolean Returns false to indicate that the parent view should handle the touch event
* as it normally would.
*/
public boolean onTouch(View v, MotionEvent event) {
if (call == null) {
return false;
} else if (event.getAction() == MotionEvent.ACTION_DOWN && call != null && call.isMuted()) {
call.toggleMute();
} else if (event.getAction() == MotionEvent.ACTION_UP && !call.isMuted()) {
call.toggleMute();
}
return false;
}
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, CALL_ADDRESS, 0, "Call someone");
menu.add(0, SET_AUTH_INFO, 0, "Edit your SIP Info.");
menu.add(0, HANG_UP, 0, "End Current Call.");
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case CALL_ADDRESS:
showDialog(CALL_ADDRESS);
break;
case SET_AUTH_INFO:
updatePreferences();
break;
case HANG_UP:
if(call != null) {
try {
call.endCall();
} catch (SipException se) {
Log.d("WalkieTalkieActivity/onOptionsItemSelected",
"Error ending call.", se);
}
call.close();
}
break;
}
return true;
}
#Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case CALL_ADDRESS:
LayoutInflater factory = LayoutInflater.from(this);
final View textBoxView = factory.inflate(R.layout.call_address_dialog, null);
return new AlertDialog.Builder(this)
.setTitle("Call Someone.")
.setView(textBoxView)
.setPositiveButton(
android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
EditText textField = (EditText)
(textBoxView.findViewById(R.id.calladdress_edit));
// sipAddress = textField.getText().toString();
sipAddress= "sip:kukukkk#ekiga.net";
initiateCall();
}
})
.setNegativeButton(
android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Noop.
}
})
.create();
case UPDATE_SETTINGS_DIALOG:
return new AlertDialog.Builder(this)
.setMessage("Please update your SIP Account Settings.")
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
updatePreferences();
}
})
.setNegativeButton(
android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Noop.
}
})
.create();
}
return null;
}
public void updatePreferences() {
Intent settingsActivity = new Intent(getBaseContext(),
SipSettings.class);
startActivity(settingsActivity);
}
}
Check your android phone is Sip supported or not.
Confirm this code is included in Manifest file:
<uses-sdk android:minSdkVersion="9" />