Мое приложение сканера QR-кода отлично работает только с urls
и texts
. Я хочу, чтобы он открывал карты Google при сканировании Geo qr code
и открывал новое действие со всей информацией о vCard qr code
. Я пытался импортировать Intents
с сайта разработчиков Goolgle, но ничего не получалось. Должен ли я изменить метод processRawResult
? Вот мое приложение:
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.drawerlayout.widget.DrawerLayout;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import com.androidcoding.qrcode.Model.QRGeoModel;
import com.androidcoding.qrcode.Model.QRVcardModel;
import com.google.android.material.navigation.NavigationView;
import com.google.zxing.Result;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
public class MainActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler {
private ZXingScannerView zXingScannerView;
private TextView textView;
private DrawerLayout dl;
private ActionBarDrawerToggle t;
private NavigationView nv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
zXingScannerView = (ZXingScannerView)findViewById(R.id.zxscan);
textView = (TextView)findViewById(R.id.text_result);
Dexter.withActivity(this)
.withPermission(android.Manifest.permission.CAMERA)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response) {
zXingScannerView.setResultHandler(MainActivity.this);
zXingScannerView.startCamera();
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response) {
Toast.makeText(MainActivity.this, "You must accept this permission", Toast.LENGTH_SHORT).show();
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
}
})
.check();
}
@Override
protected void onDestroy() {
zXingScannerView.stopCamera();
super.onDestroy();
}
@Override
public void handleResult(Result rawResult) {
processRawResult(rawResult.getText());
}
private void processRawResult(String text){
if (text.startsWith("BEGIN:")) {
String[] tokens = text.split("\n");
QRVcardModel qrVcardModel = new QRVcardModel();
for (int i = 0; i < tokens.length; i++) {
if (tokens[i].startsWith("BEGIN:")) {
qrVcardModel.setType(tokens[i].substring("BEGIN:".length()));
} else if (tokens[i].startsWith("N:")) {
qrVcardModel.setName(tokens[i].substring("N:".length()));
} else if (tokens[i].startsWith("ORG:")) {
qrVcardModel.setOrg(tokens[i].substring("ORG:".length()));
} else if (tokens[i].startsWith("TEL:")) {
qrVcardModel.setTel(tokens[i].substring("TEL:".length()));
} else if (tokens[i].startsWith("URl:")) {
qrVcardModel.setUrl(tokens[i].substring("URL:".length()));
} else if (tokens[i].startsWith("EMAIL:")) {
qrVcardModel.setEmail(tokens[i].substring("EMAIL:".length()));
} else if (tokens[i].startsWith("ADR:")) {
qrVcardModel.setAddress(tokens[i].substring("ADR:".length()));
} else if (tokens[i].startsWith("NOTE:")) {
qrVcardModel.setNote(tokens[i].substring("NOTE:".length()));
} else if (tokens[i].startsWith("SUMMARY:")) {
qrVcardModel.setSummary(tokens[i].substring("SUMMARY:".length()));
} else if (tokens[i].startsWith("DTSTART:")) {
qrVcardModel.setDtstart(tokens[i].substring("DTSTART:".length()));
} else if (tokens[i].startsWith("DTEND:")) {
qrVcardModel.setDtend(tokens[i].substring("DTEND:".length()));
}
Intent intentVcard = new Intent(MainActivity.this, VcardActivity.class);
intentVcard.putExtra("value_name" , qrVcardModel.getName());
intentVcard.putExtra("value_type", qrVcardModel.getType());
intentVcard.putExtra("value_org", qrVcardModel.getOrg());
intentVcard.putExtra("value_tel", qrVcardModel.getTel());
intentVcard.putExtra("value_url", qrVcardModel.getUrl());
intentVcard.putExtra("value_email", qrVcardModel.getEmail());
intentVcard.putExtra("value_address", qrVcardModel.getAddress());
intentVcard.putExtra("value_note", qrVcardModel.getNote());
intentVcard.putExtra("value_summary", qrVcardModel.getSummary());
intentVcard.putExtra("value_dtstart", qrVcardModel.getDtstart());
intentVcard.putExtra("value_dtend", qrVcardModel.getDtend());
startActivity(intentVcard);
}
} else if (text.startsWith("http://") ||
text.startsWith("https://") ||
text.startsWith("www.")){
Intent intentUrl = new Intent(MainActivity.this, WebSites.class);
intentUrl.putExtra("URL", text);
startActivity(intentUrl); //Sends url to WebSites Activity.
}
else if (text.startsWith("geo:"))
{
QRGeoModel qrGeoModel = new QRGeoModel();
String delims = "[ , ?q= ]+";
String tokens[] = text.split(delims);
for (int i=0;i<tokens.length;i++)
{
if (tokens[i].startsWith(" geo:"))
{
qrGeoModel.setLat(tokens[i].substring("geo:".length()));
}
}
qrGeoModel.setLat(tokens[0].substring("geo:".length()));
qrGeoModel.setLng(tokens[1]);
qrGeoModel.setGeo_place(tokens[2]);
Uri gmmIntentUri = Uri.parse(qrGeoModel.getLat() + "," + qrGeoModel.getLng());
}
else
{
Intent intentTxt = new Intent(MainActivity.this, TextActivity.class);
intentTxt.putExtra("TEXT", text);
startActivity(intentTxt); //Sends txt to TextActivity
}
zXingScannerView.resumeCameraPreview(MainActivity.this);
}
}
Когда я сканирую код vCard или Geo qr, приложение вылетает. Мой код неверен?