passing a variable to classes - java

i can not figure out how to pass the results from onActivityResult to resultBreakdown. I know there is a get/set and I've looked at a few tutorials, but I'm just not getting it. Or, Is there a better way? The program runs fine up if i comment out */ the resultBreakdown Class
Side note, I just started with java/android. I'm a better learner at doing then reading. I know my code is a little clumsy. Thanks for the help
Note: i edited code to reflect suggested changes
package com.example.spdwiz18.testproject;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.view.View.OnClickListener;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.vision.barcode.Barcode;
import java.text.DateFormat;
import java.time.*;
import java.time.temporal.*;
import java.time.LocalDate;
import java.util.Calendar;
import java.util.Date;
public class GrindLogActivity extends AppCompatActivity {
TextView barcodeResult;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gringlogactivity);
// this is how to set id's from the xml file with vNames. (julianDate)
TextView bcc = (Textview)findViewById(R.id.bccheck);
TextView pc = (Textview)findViewById(R.id.pcode);
TextView pd = (Textview)findViewById(R.id.pdate);
// TextView en = (Textview)findViewById(R.id.estnum);
TextView sn = (Textview)findViewById(R.id.seqnum);
TextView nw = (Textview)findViewById(R.id.nweight);
barcodeResult = (TextView) findViewById(R.id.barcode_result);
TextView julianDate = (TextView) findViewById(R.id.datecode);
TextView td1 = (TextView) findViewById(R.id.todaydate1);
// this is how you get a julian/original date for android
LocalDate now = LocalDate.now();
int julian = now.get(ChronoField.DAY_OF_YEAR);
// this how to set you current date for android
Date date = new Date();
String stringDate = DateFormat.getDateInstance().format(date);
// this is how to set your vNames to your method variables
julianDate.setText(Integer.toString(julian));
td1.setText(stringDate);
}
/*add click event to the scan barcode button */
public void scanBarcode(View v) {
Intent intent = new Intent(this, ScanBarcodeActivity.class);
startActivityForResult(intent, 0);
}
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0) {
if (requestCode == CommonStatusCodes.SUCCESS) {
if (data != null) {
Barcode barcode = data.getParcelableExtra("barcode");
barcodeResult.setText("Barcode value : " + barcode.displayValue);
} else {
barcodeResult.setText("No Barcode Found");
}
super.onActivityResult(requestCode, resultCode, data);
}
}
}
public void resultsBreakdown(String result) {
if (result.length() == 44) {
pc.setText(result.CharSequence(2,10));
pd.setText(result.CharSequence(13,18));
sn.setText(result.CharSequence(21,27));
nw.setText(result.CharSequence(13,18));
} else {
bcc.setText("invalid barcode");
}
}

The code posted needs a lot of work - so this answer most likely is just partial
(1) TextView initialization in wrong place
The TextViews declared as class instance variables cannot also be initialized at that point. So leave the declarations there (where bardcodeResult is declared):
TextView barcodeResult;
TextView bcc;
TextView pc;
TextView pd;
TextView sn;
TextView nw;
but move the initialization to the onCreate method in the same manner barcodeResult.
// in onCreate
barcodeResult = (TextView) findViewById(R.id.barcode_result);
bcc = (TextView)findViewById(R.id.bccheck);
pc = (TextView)findViewById(R.id.pcode);
pd = (TextView)findViewById(R.id.pdate);
sn = (TextView)findViewById(R.id.seqnum);
nw = (TextView)findViewById(R.id.nweight);
(2) The syntax is of resultsBreakdown is invalid and the functionality is wrong (need to invoke setText)- try:
public void resultsBreakdown(String result) {
if (result.length() == 44) {
pc.setText(result.CharSequence(2,10));
pd.setText(result.CharSequence(13,18));
sn.setText(result.CharSequence(21,27));
nw.setText(result.CharSequence(13,18));
} else {
bcc.setText("invalid barcode");
}
}
(3) Actually invoke the resultsBreakdown method:
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0) {
if (requestCode == CommonStatusCodes.SUCCESS) {
if (data != null) {
Barcode barcode = data.getParcelableExtra("barcode");
barcodeResult.setText("Barcode value : " + barcode.displayValue);
//-- THIS LINE WAS ADDED TO CALL METHOD
resultsBreakdown(barcode.displayValue.toString());
} else {
barcodeResult.setText("No Barcode Found");
}
super.onActivityResult(requestCode, resultCode, data);
}
}
}

I think there should be resultCode instead of requestCode in requestCode == CommonStatusCodes.SUCCESS
 #Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0) {
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
Barcode barcode = data.getParcelableExtra("barcode");
barcodeResult.setText("Barcode value : " + barcode.displayValue);
resultsBreakdown(barcode.displayValue)
} else {
barcodeResult.setText("No Barcode Found");
}
super.onActivityResult(requestCode, resultCode, data);
}
}
}
public void resultsBreakdown(String barcodeData){
if (barcodeData.length == (44)) {
pc = (barcodeData.CharSequence(2,10);
pd = (barcodeData.CharSequence(13,18);
sn = (barcodeData.CharSequence(21,27);
nw = (barcodeData.CharSequence(13,18);
)else(
bcc = "invalid barcode";
}
)
}

resultBreakdown neither a class nor a method.İt isn't even compile. You change your resultBreakDown to Method:
public void resultsBreakdown(Barcode barcodeResult){
if (barcodeResult.length == (44)) {
pc = (barcodeResult.CharSequence(2,10);
pd = (barcodeResult.CharSequence(13,18);
sn = (barcodeResult.CharSequence(21,27);
nw = (barcodeResult.CharSequence(13,18);
} else{
bcc = "invalid barcode";
}
and later in onActivityResult call your method with Barcode parameters.

The code is incomplete as you have not placed ScanBarcodeActivity java file. Well... I am placing a small code in my project which will clear your concept and even you can use it.
Here suppose i am in Activity MyClassA.java where is a button and when it is clicked it will start another activity MyClassB.java, Remember it will start that activity along with layout.. from that activity you have to finish it on certain event and when it is finished your MyClassA.java will collect its result...
From Activity MyClassA.java on button click i want to start a activity
MyClassB.java for result:
ContactsBtn.setOnClickListener(new View.OnClickListener()
{
#Override
public void onClick(View v)
{
ContactsBtn.setEnabled(false);
Intent intent = new Intent(MyClassA.this, MyClassB.class);
startActivityForResult(intent, REQUEST_CODE);
}
});
Where REQUEST_CODE should be declared in MyClassA class as public static final int REQUEST_CODE = 1;
Now From Activity MyClassB.java on particular event say on click of a button you want to close this activity and want to send result to previous activity :
SelectContactsButton.setOnClickListener(new View.OnClickListener()
{
#Override
public void onClick(View v)
{
Intent intent = new Intent();
intent.putStringArrayListExtra("WhitelistNames", (ArrayList<String>) WhitelistNames);
setResult(Activity.RESULT_OK, intent);
finish();
}
});
Here i am placing WhitelistNames array list as result to be sent to calling activity.
Now From Activity MyClassA.java again you have to collect the result with :
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == REQUEST_CODE)
{
if (resultCode == Activity.RESULT_OK)
{
ArrayList<String> WhitelistNames = data.getStringArrayListExtra("WhitelistNames");
Log.d("ContactsContracts", "\nPREVIOUS LIST : "+ContactsNumbers);
}
}
}
Remember onActivityResult method should be part of your MyClassA.java class and should not be in onCreate nor in some other existing standard methods of this class.
Hope it helps

Thank you for everyones help. This one worked as needed
package com.example.spdwiz18.testproject;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.view.View.OnClickListener;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.vision.barcode.Barcode;
import java.text.DateFormat;
import java.time.*;
import java.time.temporal.*;
import java.time.LocalDate;
import java.util.Calendar;
import java.util.Date;
public class GrindLogActivity extends AppCompatActivity {
TextView barcodeResult;
TextView bcc;
TextView pc;
TextView pd;
TextView sn;
TextView nw;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gringlogactivity);
bcc = (TextView)findViewById(R.id.bccheck);
pc = (TextView)findViewById(R.id.pcode);
pd = (TextView)findViewById(R.id.pDate);
// TextView en = (TextView)findViewById(R.id.estnum);
sn = (TextView)findViewById(R.id.seqnum);
nw = (TextView)findViewById(R.id.nweight);
barcodeResult = (TextView) findViewById(R.id.barcode_result);
TextView julianDate = (TextView) findViewById(R.id.datecode);
TextView td1 = (TextView) findViewById(R.id.todaydate1);
// this is how to set id's from the xml file with vNames. (julianDate)
// this is how you get a julian/original date for android
LocalDate now = LocalDate.now();
int julian = now.get(ChronoField.DAY_OF_YEAR);
// this how to set you current date for android
Date date = new Date();
String stringDate = DateFormat.getDateInstance().format(date);
// this is how to set your vNames to your method variables
julianDate.setText(Integer.toString(julian));
td1.setText(stringDate);
}
/*add click event to the scan barcode button */
public void scanBarcode(View v) {
Intent intent = new Intent(this, ScanBarcodeActivity.class);
startActivityForResult(intent, 0);
}
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0) {
if (requestCode == CommonStatusCodes.SUCCESS) {
if (data != null) {
Barcode barcode = data.getParcelableExtra("barcode");
barcodeResult.setText("Barcode value : " + barcode.displayValue);
resultsBreakdown(barcode.displayValue.toString());
} else {
barcodeResult.setText("No Barcode Found");
}
super.onActivityResult(requestCode, resultCode, data);
}
}
}
public void resultsBreakdown(CharSequence result) {
if (result.length() == 44) {
pc.setText(result.subSequence(2,10));
pd.setText(result.subSequence(13,18));
sn.setText(result.subSequence(21,27));
nw.setText(result.subSequence(13,18));
} else {
bcc.setText("invalid barcode");
}
}}

Related

Unresponsive data.getData for PICK_IMAGE_REQUEST

One of the Activities on an app i am building is a profile update activity with an option to upload display picture. I am trying to implement upload picture option using Picasso through the following code. So far i am unable to retrieve the picture from the phone with a constant null for Uri and failure to display picture in the ImageView due to that.
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentResolver;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.MimeTypeMap;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.UserProfileChangeRequest;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.squareup.picasso.Picasso;
public class UploadProfilePicture extends AppCompatActivity {
private ProgressBar progressBar;
private ImageView imageViewUploadPic;
private FirebaseAuth authProfile;
private StorageReference storageReference;
private FirebaseUser firebaseUser;
private static final int PICK_IMAGE_REQUEST =1 ;
private Uri uriImage;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload_profile_pciture);
getActionBar();
authProfile = FirebaseAuth.getInstance();
firebaseUser = authProfile.getCurrentUser();
Button buttonUploadPictureChoose = findViewById(R.id.upload_profile_pic_choose_button);
Button buttonUploadProfilePicture = findViewById(R.id.upload_profile_pic_upload_button);
progressBar = findViewById(R.id.progressBar);
imageViewUploadPic = findViewById(R.id.imageView_profile_pic_upload);
storageReference = FirebaseStorage.getInstance("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").getReference("UsersDisplayPictures");
Uri uri = firebaseUser.getPhotoUrl();
//Set User's current DP in ImageView (if uploaded already). Will be using Picasso
//Regular URIs
Picasso.with(UploadProfilePicture.this).load(uri).into(imageViewUploadPic);
//choosing image from phone to upload
buttonUploadPictureChoose.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
openFileChooser();
}
});
//upload image to app
buttonUploadProfilePicture.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
progressBar.setVisibility(View.VISIBLE);
UploadPic ();
}
});
}
private void openFileChooser(){
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, PICK_IMAGE_REQUEST);
}
#Override
protected void onActivityResult(int requestCode, int resultCode,#Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null){
uriImage = data.getData();
imageViewUploadPic.setImageURI(uriImage);
Toast.makeText(UploadProfilePicture.this, "Picture was chosen, please click the upload button", Toast.LENGTH_SHORT).show();
} else if (uriImage == null){
Toast.makeText(UploadProfilePicture.this, "Uri is null", Toast.LENGTH_SHORT).show();
}
}
private void UploadPic(){
if (uriImage != null){
// save the image with uid of the currently logged user
StorageReference fileReference = storageReference.child(authProfile.getCurrentUser().getUid() + " . " + getFileExtension(uriImage));
//Upload image to storage
fileReference.putFile(uriImage).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
#Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
fileReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
#Override
public void onSuccess(Uri uri) {
Uri downloadUri = uri;
firebaseUser = authProfile.getCurrentUser();
//Finally set the display image of the user after upload
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder().setPhotoUri(downloadUri).build();
firebaseUser.updateProfile(profileUpdates);
}
});
progressBar.setVisibility(View.GONE);
Toast.makeText(UploadProfilePicture.this, "Picture Upload is successful", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(UploadProfilePicture.this, UserProfileActivity.class);
startActivity(intent);
finish();
}
}).addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(#NonNull Exception e) {
Toast.makeText(UploadProfilePicture.this, e.getMessage(), Toast.LENGTH_SHORT).show();
Toast.makeText(UploadProfilePicture.this, "Something went wrong!" ,Toast.LENGTH_SHORT).show();
}
});
} else {
progressBar.setVisibility(View.GONE);
Toast.makeText(UploadProfilePicture.this, "No file was selected", Toast.LENGTH_SHORT).show();
}
}
//Obtaining File Extension of the image
private String getFileExtension(Uri uri){
ContentResolver CR = getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
return mime.getExtensionFromMimeType(CR.getType(uri));
}
No errors or noticeable Logcat line related. Simply it would exit the Picture picker and would not display the image in the imageView. Of course it would Toast the message of " Uri is null" since it is following the if statement included to follow the process steps to see the missing task !
Is my code of choosing and uploading picture is wrong or something is missing >
I guess it was a syntax error in the if statement within the onActivityResult
it was:
if (resultCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null){
Correction :
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null){
At the moment the issue is resolved and image could be chosen and displayed within the app.
Facing a new issue with this code but this should be for another question if needed
E/StorageException: StorageException has occurred.
User does not have permission to access this object.
Code: -13021 HttpResult: 403

How to progress into saving the image into SQLiteDatabase

This is where I import the image to(from gallery) and I want to save it to SQLite to hopefully display it in another activity, how would I go about doing so? I am kind of new to Android Studio so if there is some newbie kind of easy way that I would go about doing so would be very helpful.
(Update) So I have added this two lines marked by /* */ but now I can't get my app to work still have no idea how to do this.. any ideas?
Import image>Save to SQLite>Take Image to SQLite>Display in another activity
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class DataInput extends AppCompatActivity {
private EditText inputName;
private EditText inputAge;
private Button buttonSave;
private Button buttonGetLocation;
private Button buttonImportImage;
private ImageView mImageView;
private static final int IMAGE_PICK_CODE = 1000;
private static final int PERMISSION_CODE = 1001;
private InputHelper helper = null;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data_input);
inputName = (EditText) findViewById(R.id.input_name);
inputAge = (EditText) findViewById(R.id.input_age);
address = (TextView) findViewById(R.id.address);
buttonSave = findViewById(R.id.button_save);
buttonSave.setOnClickListener(onSave);
buttonImportImage = findViewById(R.id.button_import_image);
mImageView = findViewById(R.id.image_view);
buttonImportImage.setOnClickListener(onImport);
helper = new InputHelper(this); }
private View.OnClickListener onSave = new View.OnClickListener() {
#Override
public void onClick(View v) {
String nameStr = inputName.getText().toString();
String ageStr = inputAge.getText().toString();
String addressStr = address.getText().toString();
String combineStr = nameStr + "\n" + ageStr + "\n" + addressStr;
Toast.makeText(v.getContext(), combineStr, Toast.LENGTH_LONG).show();
/*BitmapDrawable drawable = (BitmapDrawable)mImageView.getDrawable();
Bitmap bitmap = drawable.getBitmap();
byte[] image = getBitmapAsByteArray(bitmap);*/
Intent i = new Intent(DataInput.this,InformationDisplay.class);
startActivity(i);
helper.insert(nameStr,ageStr,addressStr,image);
finish();
}
/* public byte[] getBitmapAsByteArray(Bitmap bitmap) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 0, outputStream);
return outputStream.toByteArray(); */
}
};
private View.OnClickListener onImport = new View.OnClickListener() {
#Override
public void onClick(View v) {
//check runtime permission
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_DENIED) {
//permission not granted, request it.
String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
//show popup for runtime permission
requestPermissions(permissions, PERMISSION_CODE);
} else {
//permission already granted
pickImageFromGallery();
}
} else {
//system os is less then marshmallow
pickImageFromGallery();
}
}
};
private void pickImageFromGallery() {
//intent to pick image
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK_CODE);
}
//handle result of runtime permission
#Override
public void onRequestPermissionsResult(int requestCode, #NonNull String[] permissions, #NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PERMISSION_CODE: {
if (grantResults.length > 0 && grantResults[0] ==
PackageManager.PERMISSION_GRANTED) {
//permission was granted
pickImageFromGallery();
} else {
//permission was denied
Toast.makeText(this, "Permission denied...!", Toast.LENGTH_LONG).show();
}
}
}
}
//handle result of picked image
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == IMAGE_PICK_CODE) {
//set image to image view
mImageView.setImageURI(data.getData());
}
}
You can save an Image in SQLite database in the form of blob. Another simple way to storing the image is in the form of base64 string. This is what I tried in my previous project and this works:
public class Profile_Class extends AppCompatActivity {
private Bitmap photo, OutImage;
private AppPreferences preferences;
private CircularImageView imageView;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile__class);
EditText name = findViewById(R.id.name);
preferences = new AppPreferences(this);
Toolbar toolbar = findViewById(R.id.toolbar_t);
EditText userName = findViewById(R.id.userName);
EditText passWord = findViewById(R.id.passWord);
imageView = findViewById(R.id.iv_profile_auditor);
ImageView take_pic1 = findViewById(R.id.take_pic1);
if (prefernces.getProfileImage().equals(" ")) {
Log.e("TAG", "NoProfilePic");
} else {
imageView.setImageBitmap(decodeBase64(prefernces.getProfileImage()));
}
take_pic1.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
});
}
#Override
protected void onActivityResult(int requestCode, int resultCode, #Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
photo = (Bitmap) data.getExtras().get("data");
OutImage = Bitmap.createScaledBitmap(photo, 300, 400, true);
prefernces.setProfileImage(encodeTobase64(OutImage));
Intent intent2 = new Intent("header_pic_update");
LocalBroadcastManager.getInstance(Profile_Class.this).sendBroadcast(intent2);
}
}
// method for bitmap to base64
public static String encodeTobase64(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
Log.d("Image Log:", imageEncoded);
return imageEncoded;
}
// method for base64 to bitmap
public static Bitmap decodeBase64(String input) {
byte[] decodedByte = Base64.decode(input, 0);
return BitmapFactory
.decodeByteArray(decodedByte, 0, decodedByte.length);
}
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
}
return true;
}
If you see in OnActivityResult class, I'm converting the outImage into Base64 string. Here use the method encodeTobase64 and add the image string to your table.
Now in the other activity where you want to show the image, call the method decodeBase64 and decode the image. In the above code I'm decoding the string to image and setting it to imageview like this:
imageView.setImageBitmap(decodeBase64(prefernces.getProfileImage()));
There are numerous ways to store and retrieve the image. This is one way I did. Mind here that I'm storing the image in bitmap so the quality will not be good. If you want image with full quality than you have to use URI to store the image in your mobile and then call the image in required quality.

Android - Call method from another class when app is closed (Using AlarmManager)

I am trying to call a method in my MainActivity class from another class using an AlarmManager.
I found this question which helped me call the method but when the app is closed, and the AlarmManager is still running it gives a NullPointerException error.
Another solution which would work for me is to have getBatteryLevel() inside my AlarmRec class. When I try this I get the error - Cannot resolve method registerReceiver(null, android.content.IntentFilter).
My MainActivity class:
package com.ds.shutdown;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.BatteryManager;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Calendar;
public class MainActivity extends Activity {
int userLvl;
int batteryLvl;
static MainActivity mainActivity;
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainActivity = this;
batteryLvl = getBatteryLevel();
String bat = Integer.toString(batteryLvl);
TextView textViewTwo = (TextView) findViewById(R.id.textBatteryLvl);
textViewTwo.setText("Battery level: " + bat);
userLvl = loadSavedPreferences();
TextView textView = (TextView) findViewById(R.id.textUserLvl);
textView.setText("User entry: " + Integer.toString(userLvl));
if (getIntent() != null && getIntent().getExtras() != null && getIntent().getExtras().getBoolean("CALL_METHOD", false)) {
shutdown();
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void shutdown() {
Toast.makeText(this, "In shutdown method", Toast.LENGTH_SHORT).show();
batteryLvl = getBatteryLevel();
String bat = Integer.toString(batteryLvl);
TextView textViewTwo = (TextView) findViewById(R.id.textBatteryLvl);
textViewTwo.setText("Battery level: " + bat);
userLvl = loadSavedPreferences();
if (batteryLvl <= userLvl) {
try {
Process process = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot -p"});
process.waitFor();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public int getBatteryLevel() {
Intent batteryIntent = registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
return level;
}
//OK button onClick
public void btnPress(View v) {
EditText mEditText = (EditText) findViewById(R.id.userLvl); //Look at text box
String userLvlStr = mEditText.getText().toString(); //Take contents and set to string
if (userLvlStr.matches("")){
Toast.makeText(this, "Invalid Entry", Toast.LENGTH_SHORT).show();
return;
}
userLvl = Integer.parseInt(userLvlStr); //Convert that string to an int
saveSavedPreferences(userLvl); //Save that int
setContentView(R.layout.activity_main); //Look at main activity
TextView textView = (TextView) findViewById(R.id.textUserLvl); //Look at text view
textView.setText("User entry: " + userLvlStr); //Change text view to show user entry
batteryLvl = getBatteryLevel();
String bat = Integer.toString(batteryLvl);
TextView textViewTwo = (TextView) findViewById(R.id.textBatteryLvl);
textViewTwo.setText("Battery level: " + bat);
alarmMethod();
}
//Saves variable(s) across app close
private void saveSavedPreferences(int userLvl){
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); //Create SharedPreferences object
SharedPreferences.Editor editor= sharedPref.edit(); //Now get editor
editor.putInt("userLvl", userLvl); //Put in variable
editor.commit(); //Save variable(s)
}
//Loads variable(s) across app close
private int loadSavedPreferences() {
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
userLvl = sharedPrefs.getInt("userLvl", 0);
return userLvl; //Using return since only one variable is needed
}
//Set alarm
private void alarmMethod() {
alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); //Create Alarm Manager
Intent intent = new Intent(this, AlarmRec.class); //Set intent
alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
//setRepeating() lets you specify a precise custom interval--in this case, 20 seconds
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
1000 * 10, alarmIntent);
Toast.makeText(MainActivity.this, "Alarm set", Toast.LENGTH_LONG).show();
}
public void cancelAlarm(View v2) {
// If the alarm has been set, cancel it.
if (alarmMgr != null) {
alarmMgr.cancel(alarmIntent);
}
TextView textView = (TextView) findViewById(R.id.textUserLvl);
textView.setText("User entry: ");
}
public static MainActivity getInstance(){
return mainActivity;
}
}
My Alarm Receiver class:
package com.ds.shutdown;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.widget.Toast;
public class AlarmRec extends BroadcastReceiver {
//#Override
public void onReceive(Context context, Intent intent) {
//Call shutdown
Toast.makeText(MainActivity.getInstance(), "Calling shutdown", Toast.LENGTH_SHORT).show();
if (MainActivity.getInstance() != null) {
MainActivity.getInstance().shutdown();
}
else {
Intent i = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//I also tried i.addFlags
i.putExtra("CALL_METHOD", true);
context.startActivity(i);
}
}
}
Because when your app is closed MainActivity.getInstance() returns null.
You should do methodToCall() in your BroadcastReceiver (if the method doesn't take long) or call Service from there, where you do methodToCall().
Another way is to modify your Receiver like this
Toast.makeText(context, "Calling shutdown", Toast.LENGTH_SHORT).show();
if (MainActivity.getInstance() != null) {
MainActivity.getInstance().methodToCall();
}
else {
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra("CALL_METHOD", true);
context.startActivity(i);
}
And MainActivity in onCreate check for CALL_METHOD extra;
if (getIntent() != null && getIntent().getExtras() != null && getIntent().getExtras().getBoolean("CALL_METHOD", false)) {
methodToCall();
}
Do not expose your main activity through a static method like a singleton.
Your activity getInstance() method will return null because it has probably been popped off the back stack (or if activity has been killed). Do not rely on your activity being present and is reference to be valid after you have backgrounded your app.
I don't understand what functionality you want in that method that the activity defines. You should be able to put that in the broadcast receiver. If you need UI to be shown, launch your activity again (in which case the UI would show up again).

Barcode scanner with outpan database

I want to develop a barcode scanner app in android, I tried using zxing library.
the zxing scanner reads a barcode very well and then asks user for websearch or product search thru google and displays google results.
Here is what I am doing up till now:
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
public class ScanCodeActivity extends Activity {
private Button scan;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.scancodelayout);
scan= (Button)findViewById(R.id.scan_button);
Button scanBtn = (Button)findViewById(R.id.scan_button);
final TextView formatTxt = (TextView)findViewById(R.id.scan_format);
final TextView contentTxt = (TextView)findViewById(R.id.scan_content);
scanBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
IntentIntegrator scanIntegrator = new IntentIntegrator(ScanCodeActivity.this);
scanIntegrator.initiateScan();
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if (resultCode == RESULT_OK) {
if (scanningResult != null) {
final TextView formatTxt = (TextView)findViewById(R.id.scan_format);
final TextView contentTxt = (TextView)findViewById(R.id.scan_content);
String scanContent = scanningResult.getContents();
String scanFormat = scanningResult.getFormatName();
Toast toast = Toast.makeText(this, "Content:" + scanContent + " Format:" + scanFormat , Toast.LENGTH_LONG);
formatTxt.setText("FORMAT: " + scanFormat);
contentTxt.setText("CONTENT: " + scanContent);
//we have a result
}
else{
Toast toast = Toast.makeText(getApplicationContext(),
"No scan data received!", Toast.LENGTH_SHORT);
toast.show();
}
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
Log.i("App","Scan unsuccessful");
}
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
What I want to achieve is I want to query a non commercial database. I have found this link:
http://www.outpan.com/developers-get-product-data.php
Can anyone tell me how to use it in android?
I want to scan a particular code and query outpan database with it so that I parse the results into Strings and display them in my android app. User's will know which product the barcode represents..

onActivityResult - data string returns null

I have problem with onActiviResult function. Code compiles and emulates but the data parameter returns null.
In function main:
private static String sActualLogin = "admin";
private static String sActualPassword = "qwerty";
(...)
public void setRegisterOnClick(View v)
{
Intent intentLOGIN = new Intent(this, Users.class);
intentLOGIN.putExtra("Type",1);
startActivityForResult(intentLOGIN, 1);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(data.getExtras().containsKey("Login")){
if(resultCode==RESULT_OK && requestCode==1){
String sContainer = data.getStringExtra("Login");
sActualLogin=sContainer;
RESULT1.setText(sActualLogin);
}
}
if(data.getExtras().containsKey("Password")){
if(resultCode==RESULT_OK && requestCode==1){
String sContainer=data.getStringExtra("Password");
sActualPassword=sContainer;
RESULT2.setText(sActualPassword);
}
}
}
And then code goes to Users:
package com.example.login;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class Users extends Activity {
private EditText etNewLogin;
private EditText etNewPassword;
private TextView RESULT3;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.users);
etNewLogin = (EditText) findViewById(R.id.etChangeLogin);
etNewLogin = (EditText) findViewById(R.id.etChangePassword);
RESULT3 = (TextView) findViewById(R.id.RESULT3);
Intent Intent2=getIntent();
int number = Intent2.getIntExtra("Type", 0);
RESULT3.setText("" +number); //returns 1 well
}
public void giveResponse(View v)
{
Intent intent = getIntent();
int iOperation = intent.getIntExtra("Type", 0);
if (iOperation == 1){
String sNewLogin = etNewLogin.getText().toString();
intent.putExtra("Login", sNewLogin);
setResult(RESULT_OK, intent);
finish();
}
if (iOperation == 2){
String sNewPassword = etNewPassword.getText().toString();
intent.putExtra("Password", sNewPassword);
setResult(RESULT_OK, intent);
finish();
}
}
}
So I sActualLogin is being set to "" after onActivityResult. Please help me with this problem; something is wrong there and I can't see it.
assuming you start Users activity with startActivityForResult(intent, 1);, the only thing I see is that you set the same variable for both of the EditText views:
etNewLogin = (EditText) findViewById(R.id.etChangeLogin);
etNewLogin = (EditText) findViewById(R.id.etChangePassword);
You can also add to the if statement on onActivityResult(...) a check to make sure its not empty:
if(data.getExtras().containsKey("Login") && !data.getStringExtra("Login").isEmpty())

Categories