Archive for Ocak, 1970

Android'te JSOUP Parse İşlemleri


Android'te JSOUP Ayrıştırma İşlemleri

Merhaba arkadaşlar, bugün sizlere JSOUP ile html taglerinin parse işlemlerinden bahsedeceğim. Öncelikle jsoup toplu şüphenesini biraz inceleyelim. Projemize dahil ettiğimiz andan itibaren projemizden bir web sayfasını yanıtlayabiliriz ve geri dönebilir değerlerle planlama veya bir web sayfasının olduğu bir veriyi alabiliriz. Jsoup web servis hizmeti bir web projesinde mobil veya başka projeden verilere erişmekte olupiz. Html taglarını parseğinde divlerin css attiributelerinden faydalanırız. Programımız hangi divin içini alacaksak onun yolunu veriyoruz. Bu şekilde temizleme daha kolay ulaşabiliyoruz. Jsoup kütüphanesinin dezavantajından bahsetmek gerekirse, html etiketlerini parse ettiğimiz sitenin etiketlerini açıyoruz.

Kütüphaneyi kısaca tanıdıktan sonra, uygulama sırasında birazcık pekiştirelim. Uygulamıyor 3 buton ve bir textview bulunmakta. Butonlara bastığımızda "http://ecemboluk.blogspot.com.tr/" adresinden başlık, yazı açıklaması ve yazarı bize getirecek. Tasarım bölümüne geçmeden önce kütüphanemizi projeye dahil edip internet izinlerini alarak işe koyuyalım.

Projemizin build.grandle (Modül: app) bölümüne bağımlılıklar bölgesel kütüphanemizi derleyin.

'org.jsoup: jsoup: 1.9.2' derlemesi

Daha sonra AndroidManifest.xmlinizi içine internet izinlerimizi alıyoruz.

Daha sonra gelen tarif ettiğimğim gibi aktivite sayfasımızı tasarlıyoruz.





    

Şimdi de kod bölümüına gelelim, kod üzerinde yorum satırlarıyla olayı anlatmaya çalışacağım ve sonunda çalışma planı anlatan kısa bir yazı ekleyeceğim.

        Button baslik; // Başlık butonu
    Button aciklama; // Açıklama butonu
    Button yazar; // Yazar butonu
    TextView metni; // metin butonu
    @Override
    korumalı void onCreate (Bundle savedInstanceState) {// Oncreat metodu ile nesnelerimizi oluşturduk ve classlarımızı çağırdık.
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_main);
        Metin = (TextView'un) findViewById (R.id.textView2);
        baslik = (Düğme) findViewById (R.id.baslik);
        baslik.setOnClickListener (yeni View.OnClickListener () {
            @Override
            public void onClick (Görünüm v) {
                  yeni Baslik (). execute ();
            }
        });
        aciklama = (Düğme) findViewById (R.id.aciklama);
        aciklama.setOnClickListener (yeni Görünüm.OnClickListener () {
            @Override
            public void onClick (Görünüm v) {
                  yeni Acıklama (). execute ();
            }
        });
        yazar = (Button) findViewById (R.id.yazar);
        yazar.setOnClickListener (yeni görünüm.OnClickListener () {
            @Override
            public void onClick (Görünüm v) {
                 new Yazar (). execute ();
            }
        });
    }

Başlık için oluşturduğumuz sınıfı açıklayalım.

özel sınıf Baslik, AsyncTask'ı genişletiyor
    {
        String URL = "http://ecemboluk.blogspot.com.tr"; // site urlsi
        Dize baslik;
        ProgressDialog dialog; // dialog nesnesini tanımladık
        @Override
        korumalı void onPreExecute () // Verilerin çekilme aşamasında prologlar diyalog çalıştırır.
        {
            super.onPreExecute ();
            dialog = new ProgressDialog (MainActivity.this);
            dialog.setTitle ("Jsoup Uygulama.");
            dialog.setMessage ("Veri getiriliyor");
            dialog.setIndeterminate (yanlış);
            Dialog.Show ();
        }
        @Override
        korumalı Void doInBackground (Void ... params) {// Arka planınızda gerçekleştirilir.
            Deneyin {
                Belge doc = Jsoup.connect (URL) .get (); // Site ile bağlantı kurulur. Bu bağlantı doc nesnesine aktarılır.
                baslik = doc.title (); // doc nesnesinden başlık metodu getirerek başlık çekilir.
            } yakalamak (IOException e) {
                e.printStackTrace ();
            }
            null döndür;
        }
        @Override
        korumalı void onPostExecute (Void önlemek) // Arka planınızın bittikten sonra başlık ayarlaılır.
        {
            text.setText (baslik);
            dialog.dismiss ();
        }
    }

Belge sınıfı jsoup kütüphanesine aittir. Jsoup.connet metodu ile istediğiniz url'ye bağlanılır ve bilgi belgesi sınıfının oluşturulmuş nesnesine aktarılır. daha sonra başlık metodu çağırıyor sitedeki başlık çekebilir. Bu sınıf oluşturuken AsyncTask sınıfından kalıtım alıyoruz. AsyncTask sınıfı Java'daki Konu sınıfının Android SDK'sı için hali hali denilebilir daha fazla bilgiyi buradaki dersten elde edilebilir.

Şimdi de açıklama için oluşturmamız sınıfı inceleyelim.

  özel sınıf Acıklama, AsyncTask'ı genişletiyor
    {
        String URL = "http://ecemboluk.blogspot.com.tr/2015/06/c-ve-net-ortam-nedir-ne-degildir.html";
        Dize acıklama;
        Dize veri;
        ProgressDialog iletişim kutusu;
        @Override
        korumalı geçersiz onPreExecute ()
        {
            super.onPreExecute ();
            dialog = new ProgressDialog (MainActivity.this);
            dialog.setTitle ("Jsoup Uygulama.");
            dialog.setMessage ("Veri getiriliyor");
            dialog.setIndeterminate (yanlış);
            Dialog.Show ();
        }
        @Override
        korumalı Void doInBackground (Void ... params) {
            Deneyin {
                Belge doc = Jsoup.connect (URL) .get (); // Siteye bağlantı sağlanıyor.
                Elements elements = doc.select ("div (class = içeriye giriş sonrası)"); // div tagına ait attiribute çağrılıp Element sınfının içerdiği nesneye aktarılıyor.
                elements.select ("p"); // elements nesnesi olduğu p tagları çağırılıyor.
                elements.select ("img"). remove (); // elements nesnelerinizde img tagları siliniyor.
                veri = elements.html (); // iste html taglarını çeker.
                aciklama = Jsoup.parse (veri) .text (); // html taglarını texte çevirir.
            } yakalamak (IOException e) {
                e.printStackTrace ();
            }
            null döndür;
        }
        @Override
        korumalı void onPostExecute (Void önlemek)
        {
            text.setText (aciklama);
            dialog.dismiss ();
        }
    }

Öncelikle en bizim yaptığımız gibi site ile bağlantı kuruyoruz. Daha sonra doc nesnesine aldığımız ilgileri biraz daha ayıklayıp elementleri nesnesine aktarıyoruz. Burada div etiketinde istediğimiz özellik öznitelik ile birlikte alıyoruzuz. daha sonra elementler nesnesinden p tagındaki adresiniz sizi gönderiyoruz. Bunları html metodu ile string veriye çevirip daha sonra jsoup.parse metodu ile metin haline çevirip bağlanıyoruz.

Son olarakta yazar sınıfını inceleyelim.

Özel sınıf Yazar AsyncTask'ı genişletti
    {
        String URL = "http://ecemboluk.blogspot.com.tr/2015/06/c-ve-net-ortam-nedir-ne-degildir.html";
        Dize yazar;
        Dize veri;
        ProgressDialog iletişim kutusu;
        @Override
        korumalı geçersiz onPreExecute ()
        {
            super.onPreExecute ();
            dialog = new ProgressDialog (MainActivity.this);
            dialog.setTitle ("Jsoup Uygulama.");
            dialog.setMessage ("Veri getiriliyor");
            dialog.setIndeterminate (yanlış);
            Dialog.Show ();
        }
        @Override
        korumalı Void doInBackground (Void ... params) {
            Deneyin {
                Belge doc = Jsoup.connect (URL) .get ();
                Elements elements = doc.select ("div (sınıf = yazar-içerik)");
                elements.select ( "h5");
                veri = elements.html (); // iste html taglarını çeker.
                yazar = Jsoup.parse (veri) .text (); // html taglarını texte çevirir.
            } yakalamak (IOException e) {
                e.printStackTrace ();
            }
            null döndür;
        }
        @Override
        korumalı void onPostExecute (Void önlemek)
        {
            text.setText (yazar);
            dialog.dismiss ();
        }
    }

Açıklama için yapılan işlemlerin benzerlerini de yazar sınıfında yapıyoruz. Böylelikle Rengi tanımlamış oluyoruz. Kodları daha ayrıntılı bir şekilde buradan elde edilebilir. Ayrıca JSOUP hakkında daha detaylı bilgiyi buradan elde edilebilir.

Tekrardan kolay gelsin. 🙂


Android 6.0 ve Yenilenen İzin İsteme Mekanızması


Android 6.0 ve Yenilenen İzin İsteme Mekanızması

 

Bildiğiniz gibi uygulama içinde kullanmak istediğimiz özellikler için AndroidManifest.xml dosyasına gerekli izinleri tanımlamamız yetiyordu. Kullanıcı Google Play’den uygulamayı indiriken, istediğimiz izinler karşısında listeleniyor ve uygulamayı  indirmek için  bu izinleri kabul etmek zorunda kalıyor. Sonrasında ise uygulama bu özellikleri tekrar izine ihtiyaç duymadan defalarca kez kullanabiliyordu. Fakat Android 6.0 ile bu izin yapısı biraz değişikliğe uğradı. Şöyle ki, Google kullanılan izinleri NORMAL İZİNLER ve TEHLİKLELİ İZİNLER olarak ikiye ayırdı. (Aslında iki değil dört kategori var fakat ilk ikisi yeterli bizim için.) Tehlikeli olarak tanımlanan türden izinler için AndroidManifest.xml’e tanımlamak yeterli olmuyor artık, uygulama çalışırken izin gereken bir iş yapmak istediğinde anında kullanıcıya sorup, her defasında izin almamız gerekiyor.

Özetle,  tüm izinleri yine AndroidManifest.xml‘e tanımlıyoruz. Beraberinde tehlikeli izin gerektiren işler içinse uygulama çalışırken tekrar izin istemek zorundayız. IPhone kullanan kullanıcılar bu yapıya aşinadır aslında. Çünkü IOS bu izin yapısını yıllardır başarıyla kullanıyor kendi uygulamaları içinde.

Bahsettiğimiz izin kategorilerine giren izinleri aşağıdaki gibi  listeleyebiliriz.

Normal İzinler:  https://developer.android.com/guide/topics/security/normal-permissions.html

Tehlikeli İzinler: https://developer.android.com/guide/topics/security/permissions.html?normal-dangerous

Örneğin internete bağlanmak normal bir izin gerektiriken, rehbere ulaşmak, SD karta dosya yazmak ya da bir numarayı aramak tehlikeli izin kategorisine giriyor.

İZİNLER İÇİN YENİ BİR DESIGN PATTERN

Gel gelelim bu izinleri nasıl isteyeceğimize. İzin istemek ve kullanıcının izin verip vermediğini kontrol etmek için yaklaşık 30 satırlık standart bir kod yazmamız gerekli. Uygulama içinde ortalama on yerde izin talebinde bulunduğumuzu düşünürsek 300 satırlık gereksiz ve kendini tekrar eden bir kod yığını oluşur. Üstelik izin istediğimiz iş ve izin isteme işlerini aynı metodda toplarsak bu Single Responsibility Prensibine de aykırı olacaktır.

Peki Çözüm Nedir?

Malum yazılım dünyasında patternlar, prensipler derken her işi yapmanın adam akıllı yolları var. Bunun için de tavsiye edilen yöntem Runtime Permissions Activity Pattern’dir.  Uzun lafın kısası, abstract bir Actvitiy sınıfı yazıyoruz. Bu abstract sınıf içinde izin istemek ve izinin sonucunu kontrol etmek için gerekli metodlar bulunuyor.  Yazdığımız tüm Activity sınıflarında bu abstract sınıfı extend ediyoruz ve gönül rahatlığı ile kullanabiliyoruz.

 

RuntimePermissionsActivity.java

 

public abstract class RuntimePermissionsActivity extends AppCompatActivity {

    private SparseIntArray mErrorString;

    @Override

    protected void onCreate(@Nullable Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        mErrorString = new SparseIntArray();

    }

    @Override

    public void onRequestPermissionsResult(int requestCode, String() permissions, int() grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        int permissionCheck = PackageManager.PERMISSION_GRANTED;

        for (int permission : grantResults) {

            permissionCheck = permissionCheck + permission;

        }

        if ((grantResults.length > 0) && permissionCheck == PackageManager.PERMISSION_GRANTED) {

            onPermissionsGranted(requestCode);

        } else {

            Snackbar.make(findViewById(android.R.id.content), mErrorString.get(requestCode),

                    Snackbar.LENGTH_INDEFINITE).setAction("ENABLE",

                    new View.OnClickListener() {

                        @Override

                        public void onClick(View v) {

                            Intent intent = new Intent();

                            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

                            intent.addCategory(Intent.CATEGORY_DEFAULT);

                            intent.setData(Uri.parse("package:" + getPackageName()));

                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                            intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

                            intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

                            startActivity(intent);

                        }

                    }).show();

        }

    }

    public void requestAppPermissions(final String() requestedPermissions,

                                      final int stringId, final int requestCode) {

        mErrorString.put(requestCode, stringId);

        int permissionCheck = PackageManager.PERMISSION_GRANTED;

        boolean shouldShowRequestPermissionRationale = false;

        for (String permission : requestedPermissions) {

            permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission);

            shouldShowRequestPermissionRationale = shouldShowRequestPermissionRationale || ActivityCompat.shouldShowRequestPermissionRationale(this, permission);

        }

        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {

            if (shouldShowRequestPermissionRationale) {

                Snackbar.make(findViewById(android.R.id.content), stringId,

                        Snackbar.LENGTH_INDEFINITE).setAction("GRANT",

                        new View.OnClickListener() {

                            @Override

                            public void onClick(View v) {

                                ActivityCompat.requestPermissions(RuntimePermissionsActivity.this, requestedPermissions, requestCode);

                            }

                        }).show();

            } else {

                /*User has chosen "Never ask again."  So we shouldn't request again.. DO NOTHING*/

            }

        } else {

            onPermissionsGranted(requestCode);

        }

    }

    public abstract void onPermissionsGranted(int requestCode);

}

RuntimePermissionsActivity.java sınıfımız içinde üç tane metod bulunuyor. İlki requestAppPermissions()  isimli metod izin istemek için çağrılması gereken metoddur. Dikkat ederseniz ilk parametresi String değil String dizisidir.(String()) Yani aynı anda birden fazla izin istemek için kullanılabilir bu metod.

İkinci metod onRequestPermissionsResult()    bizim yazmadığımız, FragmentActivity.java sınıfından miras alıp override ettiğimiz metoddur. Bu metod kullanıcının bize izin verip vermediğini anlayacağımız bir callback yani geri bildirim metodudur.   Eğer kullanıcı bize izin vermişse onPermissionsGranted()    isimli abstract metodu çağırarak, izin isteğinin yapıldığı asıl Activity sınıfına haber veriyoruz. bu metod bu yüzden abstract olarak tanımlandı. Eğer kullanıcı izin vermemişse de elimizden gelen birşey yok. bu özelliği kullanamayacağız demektir.

Sıklıkla yapılan bir hataya dikkat çekmek isterim.  Herhangi bir izin kullanıcıdan red almışsa, bu izin  ikinci kez istendiğinde Android işletim Sistemi, açılan pencereye “Bir daha sorma” şeklinde bir checkbox çıkarır. Kullanıcı bu kısmı işaretlerse, bu izin tekrar istenmemelidir. Bu durum kullanıcıyı rahatsız eder.  Fakat yazılım geliştiriciler genelde bu kontrolü görmezden gelerek bu ayar işaretli olsa da olmasa da izin isteme yoluna giderler. Bu durum kullanıcıyı rahatsız eder.

Kullanıcının bu izin için bir daha rahatsız edilmek istemediğini  requestAppPermissions()   metodu içerisindeki  shouldShowRequestPermissionRationale  değişkeninden anlayabiliyoruz. Eğer false  gelirse kullanıcıyı rahatsız etmiyoruz.

 

Son olarak, bu metodları nasıl çağıracağımıza bakıyoruz. Yazacağımız her Activity sınıfında RuntimePermissionAbstractActivity.java sınıfını extend etmemiz gerekiyor.

 MainActivity.java

public class MainActivity extends RuntimePermissionsActivity {

    private static final int REQUEST_PERMISSION_READ_CONTACTS = 1;

    private static final int REQUEST_PERMISSION_WRITE_EXTERNAL_STORAGE = 2;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);



               

MainActivity.super.requestAppPermissions(new

                        String(){Manifest.permission.READ_CONTACTS,}, R.string

                        .runtime_permissions_txt, REQUEST_PERMISSION_READ_CONTACTS);

               

MainActivity.super.requestAppPermissions(new

                        String(){Manifest.permission.WRITE_EXTERNAL_STORAGE}, R.string.runtime_permissions_txt, REQUEST_PERMISSION_READ_CONTACTS);

    }

    @Override

    public void onPermissionsGranted(final int requestCode) {

        if (requestCode == REQUEST_PERMISSION_READ_CONTACTS) {

            Toast.makeText(this, "Permissions Received for reading contacts.", Toast.LENGTH_LONG).show();

        } else if (requestCode == REQUEST_PERMISSION_WRITE_EXTERNAL_STORAGE) {

            Toast.makeText(this, "Permissions Received for writing SD card.", Toast.LENGTH_LONG).show();

        }

    }

}

 

Override ettiğimiz  onPermissionsGranted()   metodu,  kabul edilen her izin için tetiklenecek kabul edilmeyenler içinse gereksiz gürültü yapmayacaktır.

Projenin kodlarını Github hesabımızda indirebilir, bedava uygulamanın keyfine varabilirsiniz.

Github : https://github.com/burhanaras/Android-Runtime-Permissions

Teşekkürler.

Burhan ARAS

 

Yorum yapmak için Giriş Yapın ya da Üye olun.


10 Mobil Prototip Hazırlama ve Test Aracı


10 Mobile Prototype Preparation and Testing Tool

Paper prototypes prepared for a mobile application

The most common method for conceptual design is to prepare prototypes. The prototype is a limited representation of a product design, for example the prototype of a construction can be a small scale model of it. In the case of software products, the prototype is usually a sketch / scribble drawing of screen images or a piece of non-functional (image only) software. In the above drawing, you can see screen prototypes prepared on paper for a mobile application and a representation of the flow between screens.

The main purpose of prototypes is to embody the features that are difficult to explain verbally or that are expressed as fuzzy. Prototypes can be presented to users to determine if their needs are understood correctly. Prototypes can be scribbled on paper or can be created on computer using some tools. Specialized tools for mobile applications we will review in this article promise to make prototyping and testing extremely fast, easy and professional.

Fluid UI

A tool for creating prototypes by moving the UI interface elements to the screen by drag and drop. As shown in the image below, items such as buttons, form elements, icons and text can be placed on the right side of the screen. It is also possible to add various touch interactions and transitions between screens later.

The tool also has a wide range of interfaces for iOS, Android and Windows operating systems. Thus, it is possible to create designs directly with realistic elements instead of draft. For example, you can see the draft of the same design or the iOS library below.

The designs can be viewed in full screen on mobile devices by using Fluid Androids Android application (iOS application was under development at the time of writing). Since interactions also work in this application, user tests can be performed almost as if they were on the actual application.

https://www.fluidui.com/

Invision

Invision defines itself as a platform for design, communication and collaboration. Designs uploaded to the platform can be viewed by people in different locations on different devices, and comments and notes can be left on them. In addition, simple interaction functions can be added to the designs and used in user tests.

It is not possible to create a screen from scratch in the web application. Instead, JPG, PNG or PDF format ready screen designs can be loaded. Interactivity can be easily added to these screens as shown below.

It is possible to view older versions of the screen in history mode, and to comment or reply to items on the screen in comment mode. In addition, simple doodles can be added to the comments. Below is a sample image from comment mode.

http://www.invisionapp.com/

Proto.io

Proto.io is a web-based tool that allows you to design screens, animations and interactions by drag and drop, similar to the Fluid UI. It has large libraries for iOS, Android and Windows operating systems, so it is possible to create lifelike screens. Developed screens can be tested via a browser from any mobile device as a web application. Below is a prototype for a tablet with Windows 8 using Proto.io.

When the paid version of the tool is purchased, the prototypes can be exported directly as HTML and used directly. Proto.io also includes features such as sharing designs with others, adding comments on designs, such as Invision. Below is a comment added to an iOS prototype.

http://proto.io/

POP – Prototyping on Paper

POP prefers a very different approach from the prototype development tools we have examined above. They argue that complex software slows down prototyping and is the easiest way to make prototypes with paper and pencils, saying that the only shortcoming of such crafted designs is interaction.

POP, iOS and Android operating system is a mobile application. With this application, we take photos of the hand-drawn designs, then add touch interactions to them. We can test the prototypes on the iPhone and iPad or on the web. Below you will find 2 screenshots of adding interactivity.

https://popapp.in/

solidify

Solidify is a tool that supports interactive display designs and displays them on different devices over the web, similar to the prototype development tools we've explored above. However, the real strength of Solidify is revealed in the testing phase. The user to whom we send the prototype's web address is testing the application while Solidify saves the screen shot and keeps automatic statistics such as time spent on a page, visit rate.

In addition, users can be assigned a task and track how many users have successfully completed it, which screens are visited in which order. You can view images from Solidify's results report screens below.

http://www.solidifyapp.com/

I userzoo

UserZoom is a software that provides many user experience tests for desktop and mobile applications. When a mobile usability test is required, UserZoom allows the user to submit a questionnaire before the application to be tested and an evaluation form at the end. When the user receives the invitation, UserZoom downloads the survey application, completes the survey, tries to fulfill the tasks assigned within the tested application, and finally evaluates the application. Afterwards, the results of the survey and the data recorded while the application is used can be reviewed and commented on the application's usability. Below are the screens that list these results.

http://www.userzoom.com/

Delight.io

Delight.io is a library that integrates iOS applications and holds usage data. It can store statistics and record screenshots similar to the tools mentioned above. What's more, it records the user's voice and image through the front camera of the mobile device. Thus, for example, we have the opportunity to examine in which stages the user is forced, annoyed or satisfied. In addition, the user can comment on the application quite naturally, only by talking.

http://www.delight.io/

UX Recorder

If the goal is to record audio and video while performing a user assessment of a web-based prototype, not an application, the iX app called UX Recorder can be used. When executed in any web application or web-based prototype UX Recorder, the screen image, user image and sound can be recorded in a similar way to Delight.io.

If you want to keep detailed statistics and assign tasks to users, as well as record audio and video, it is useful to have the web-based prototypes created with Solidify, for example, run in the browser of the UX Recorder to test the user.

http://www.uxrecorder.com/

Arise.io and OptimiMo

A / B testing is a method used to determine which of the two or more variations of a product will be more adopted by users or better meet the objectives of the product provider.

If there are multiple variations of a mobile application with small or large differences, the results can be examined by showing them to different users randomly or according to a specific rule. There are libraries such as Arise.io or OptimiMo that allow A / B testing for mobile applications. Once these libraries have been integrated into the application, each time a user downloads the application, they can display demographic information, operating system version, screen size, and so on. or with a different interface. Below is the screen where you can determine which variation is likely to be displayed with the Arise.io library.

These libraries then retain statistical information for each variation and provide it to the application provider. Metrics such as the total amount of in-app purchases, the rate at which a particular screen reaches, the number of new accounts can be determined, and the most successful of the variations can be selected. Below you can find examples of statistics screens for Arise.io library.

http://arise.io/
http://www.optimimo.com/

To comment Please Login or Become a member.


Firebase ile Bildirim Gönderme (Android)


Firebase ile Bildirim Gönderme (Android)

Firebase için genel anlatım yapıldığı için o konulara girmeyeceğim.

İlgili konular;

Firebase nedir? Avantajları nelerdir?

bu adreste anlatılmıştır.

Şimdi Firebase ile nasıl notification gönderebiliriz adım adım bunu gerçekleştirelim. Öncelikle Firebase giriş yapıp üstte Konsola Git kısmına giriyoruz. Google hesabınızla giriş yaptıktan sonra bir uygulama oluşturuyoruz. Bunun için altta gördüğünüz ekrandan Create New Projecttıklayoruz.

Burada karşınıza çıkan ekrandan Create New Project diyoruz. Ve gelen ekranda uygulama adıyla beraber konumumuzu da seçtikten sonra create project diyoruz.

Sonrasında açılan pencerede (pencere açılmazsa projenize tıklayarak açabilirsiniz) karşımıza çıkan menüde Add Firebase to your Android App kısmına tıklayıp devam ediyoruz.

İlk adımda karşınıza çıkan pencerede package name kısmına oluşturacağınız projenin package adını yazıyoruz ve Add App diyoruz.

Debug signing certificate SHA-1 kısmını boş geçebilirsiniz.

Bu adımdan sonra  google-services.json isminde bir dosya indirecek.

Bu dosyayı altta gördüğünüz şekilde app dizinine atıyoruz.

 

Sonraki adımda ise hem projenin hemde uygulamanın Gradle dosyalarına eklememiz gereken kodlar veriliyor. Bunlarıda uygun yerlere ekleyerek Android Studio’da “Gradle” dosyalarını senkronize etmek için Sync Now tıklıyoruz ve Firebase consoldaki adımları Finish diyerek bitiriyoruz.

Şimdide projemizde bildirim servisini kullanabilmemiz için gerekli dependency alttaki gibi projenizin build.gradle(Mpdule: app) dosyasına ekleyerek Sync Now tıklıyoruz.

dependencies {

compile 'com.google.firebase:firebase-messaging:9.0.1'

}

apply plugin: 'com.google.gms.google-services'

 

En alttaki apply plugin kısmını dependencies in dışına eklememiz gerekiyor.

Sonrasında projemizde bir FirebaseMessagingService oluşturmamız gerekiyor ve onMessageReceived metodunu kullanarak bildirim işlemlerini bu metod içerisinde gerçekleştiriyoruz.

 

public class MyFirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        showNotification(remoteMessage.getData().get("message")); // Mesaj içeriği alınıp bildirim gösteren metod çağırılıyor
    }

    private void showNotification(String message) {

        Intent i = new Intent(this,MainActivity.class); // Bildirime basıldığında hangi aktiviteye gidilecekse
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
                .setAutoCancel(true) // Kullanıcı bildirime girdiğinde otomatik olarak silinsin. False derseniz bildirim kalıcı olur.
                .setContentTitle("FCM Test") // Bildirim başlığı
                .setContentText(message) // Bildirim mesajı
                .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark) // Bildirim simgesi
                .setContentIntent(pendingIntent);

        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        manager.notify(0,builder.build());
    }
}

Daha sonra da bir MyFirebaseInstanceIDService sınıfı oluşturuyoruz aşağıdaki gibi olması gerekiyor.

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    @Override
    public void onTokenRefresh() {
        String token = FirebaseInstanceId.getInstance().getToken();
        registerToken(token);
        Log.d("TOKEN Verildi", token);
    }

    private void registerToken(String token){

    }}


MainActivity kısmına hiç birşey eklemiyoruz bildirim için bildirimleri servis olarak dinliyoruz çünkü, siz uygulamanızı istediğiniz gibi yönetebilirsiniz servisler dışında.

Son olarak Manifest dosyamızın aşağıdaki gibi olması gerekiyor:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mrhobekkaya.firebasenotification">
<uses-permission-sdk-23 android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name=".MyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

        <service
            android:name=".MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
    </application>

</manifest>

 

Uygulama tarafındaki kodlar bu şekilde. Şimdi de yine Firebase konsola gelip soldaki Notifications kısmına gelerek yeni bir bildirim göndermek için Send your First Message’ı tıklıyoruz.

Send Message dediğimizde sonuç;

İşte bu kadar basit arkadaşlar, iyi çalışmalar.

Yorum yapmak için Giriş Yapın ya da Üye olun.


Turkcell T40'ın Öyküsü


The Story of Turkcell T40

The T40's story began in late 2012. We set out to offer a phone call from WE.

First, we tell our dream to meet with Turkey's leading design firm Local Design. We started the concept design stage with two design companies and created 20 different design concepts for a technological, fast, simple and stylish phone that Turkish people will love. The designs were evaluated aesthetically and technically and the concept of the current design of Turkcell T40 was chosen.

Owner of concept design My Design We started the first network tests such as antenna performance and component design.

In a period of six months, the T40 with its design, color and material took its present appearance.

T40 design wasn't just about industrial design, of course. When the concept design was determined, we started the interface design works that completed the design language. Interface studies were started with feedback from T series and other Turkcell Smartphone users. We have identified the features that Turkish people find most important and which are used most frequently, and we have “if only” collected them.

Together with our user experience team, we focused on features that make life easier. We've added shortcuts to access message, call, and email notifications from the lock screen. If the phone is locked in case of emergency, we have developed the ability to add an emergency contact to the emergency call screen so that the relatives of the phone can be reached. And we designed and developed the card display, which can be accessed from the 9 most commonly used functions from a single menu.

T40 "us" What else can we do so we have to be examined contemplating cultural elements of the geography-specific sound and we live in Turkey. Turkey is reminiscent of tea blending laws, sounds like the cry of seagulls and ferries whistle as we launched the alert tone. We will present our unique textures and motifs as accessories.

We wish you to enjoy and enjoy the good news with Turkcell T40 Turkcell


Activity ve Fragment Çağırmanın Doğru Yöntemi


Etkinlik ve Parçayı Çağırmak İçin Doğru Yöntem

Faaliyet ve Fragmanlar uygulamanın ekranlarını temsil ettiğinden, önemli bir yere sahiptir. Bu nedenle, bu aşamada kötüye kullanma, gelecekte tüm uygulamamızın spagetti koduna dönüştürülmesine yönelik ilk adımlardan biridir.

Yazılım dünyasında tek bir gerçek yoktur, ancak bir işin otoriteler tarafından kabul edilmesinin yolları vardır. Yeni bir Etkinlik veya Parça çağırmanın doğru yollarını görmeden önce, yanlış aramalara bakalım.

Yanlış Uygulama 1

HomeActivity.user = kullanıcı;
Amaç amacı = yeni Amaç (LoginActivity.this, HomeActivity.class);
Yıldızlanma (niyet);

Yeni arkadaşlar tarafından en sık kullanılan yöntemdir. Etkinliğinizde statik bir değişken tanımlayın ve ardından Etkinliği çağırın. Statik değişkenlerin uygulamayı test etmeyi zorlaştırdığına dikkat edilmelidir. Ayrıca, bu Aktiviteyi çağıran istemci, her zaman bu statik değişkene değer vermesi gerektiğini bilmiyor. Bu nedenle, bu yöntem terk edilmelidir.

Yanlış Uygulama 2

özel statik final String KEY_USER = "KEY_USER";

Amaç amacı = yeni Amaç (bu, HomeActivity.class);
intent.putExtra (KEY_USER, kullanıcı);
Yıldızlanma (niyet);

İlki olandan daha iyi, ancak yine de yanlıştır. Çünkü KEY_US HomeActivity'de aynı dizgeyi oluşturmamız gerekiyor. Bu dize, HomeActivity'yi çağıran tüm sınıflarda da tanımlanmalıdır. Yedek kod tekrarı, Anahtar-değer çiftlerini yönetmek zor… Ayrıca yazım hataları durumunda hatalara çok eğilimlidir.

Yanlış Uygulama 3

Amaç amacı = yeni Amaç (bu, HomeActivity.class);
intent.putExtra (HomeActivity.KEY_USER, kullanıcı);
Yıldızlanma (niyet);

Önceki hatadan öğreniyoruz. KEY_USER dizisini HomeActivity'ye götürdük. Bu durumda, HomeActivity'yi çağıran her sınıfta tanımlanması gerekmez. Ancak bu durumda, HomeActivity'de bu String'e bağımlı hale geliyoruz. HomeActivity'yi çağırırken bu String'i anahtar olarak kullanmamız gerektiğini nereden biliyoruz? Bu gelecekte olası hataları davet edecektir.

Yanlış Uygulama 4

Amaç amacı = yeni Amaç (bu, HomeActivity.class);
intent.putExtra (Constants.KEY_USER, kullanıcı);
Yıldızlanma (niyet);

Neredeyse geliştirdiğimiz kadarını yarattığımız ünlü Sabitler sınıfına hoş geldiniz ve şifre, kullanıcı adı, anahtar gibi hemen hemen tüm sabit değerleri yazdık. Hemen hemen her proje var. Son çare olarak, Constants sınıfında KEY_USER Stringini tanımladık, fakat ne yazık ki bu doğru değil. Hangi anahtarın aranacağını bize söylemez ve gereksiz yere bu sınıfa bağımlı kılar.

Sonunda doğru uygulama

Sonuçta, doğru yol anahtarı asla kullanmamaktır. Parametre olarak gönderdiğimiz nesne, anahtar kullanmadan doğrudan göndermektir. Bu yöntemin adı Statik Fabrika Yöntemiolduğunu. Daha fazla uzatmadan, size doğru yolu gösterelim, sonra açıklayacağız.

Amaç niyet = HomeActivity.newIntent (LoginActivity.this, kullanıcı);
Yıldızlanma (niyet);

Bunu böyle çağırırsak, HomeActivity anahtarı dediğimiz dizeleri yönetmemize gerek kalmaz. Bize Niyeti Geri Getirmedeki HomeActivity newıntent () Yöntemi tanımlarız.

genel sınıf HomeActivity, AppCompatActivity'yi {

özel statik final String KEY_USER = "KEY_USER";

@Override içinde
korumalı geçersiz onCreate (Bundle savedInstanceState) {
A-A muamelesi (A maddesinde saklanan maddeler);
setContentView (R.layout.activity_ho OMe);

Kullanıcı kullanıcısı = getIntent (). GetParcelableExtra (KEY_USER);
if (user! = null) {
Log.d (TAG user.tostring ());
}
}

public static Amaç newIntent (Etkinlik arayanı Etkinliği, Kullanıcı kullanıcısı) {
Amaç niyet = new Amaç (arayanActivity, HomeActivity.class);
intent.putExtra (KEY_USER, kullanıcı);
dönüş amacı;
}
}

Bu yöntemin asıl adı Statik Fabrika Yöntemiolduğunu. Joshua Blochyazılım dünyasında en popüler kitaplardan biridir. Etkili JAVA ilk makalede. Bu kitabı okumanızı şiddetle tavsiye ederim.

Çağıran Parçalar

Benzer şekilde, statik fabrika yöntemini kullanarak parçalar için parametreler gönderebiliriz.

                genel statik BlankFragment newInstance (Dize param1, Dize param2) {
BlankFragment fragmanı = yeni BlankFragment ();
Bundle args = new Bundle ();
args.putString (ARG_PARAM1, param1);
args.putString (ARG_PARAM2, param2);
fragment.setarguments (args);
dönüş fragmanı;
}

@Override içinde
public void onCreate (Paket kurtarıldıInstanceState) {
A-A muamelesi (A maddesinde saklanan maddeler);
if (getArguments ()! = null) {
mParam1 = getArguments (). getString (ARG_PARAM1);
mParam2 = getArguments (). getString (ARG_PARAM2);
}
}

Joshua Bloch& # 39; Şöhret Etkili Java Kitabı tekrar okumanı tavsiye ederim.

Güle güle.


Hazır Arayüzler



Hayır, "A uygulaması bu arayüzü nasıl yaptı ve B uygulaması bu görsel akışı hangi kodlarda kullandı?" Merak ettin mi O zaman bu yazı tam size göre!


Google I/O 2017’nin Ardından


Google I / O 2017’den sonra

17-19 Mayıs tarihleri ​​arasında gerçekleşen Google I / O 2017 konferansına katılma fırsatım oldu. Konferansta açıklanan yeniliklerden bahsetmek istiyorum.

Android O

Android O (Android (8.0) beta sürümü tanıtıldı.

Fotoğraf içinde fotoğraf: Bu özellik 2016 yılında Android TV'ye geldi. Android O ile artık telefonda video izlerken diğer uygulamalar da kullanılabilir.

Bildirim Noktaları: Bu özellik aslında farklı başlatıcı uygulamaları sağlar. Android O ile birlikte Google varsayılan özelliği olarak eklendi. Uygulama simgesini basılı tutarsanız, ilgili uygulamanın bildirimlerini okuyabilirsiniz.

Akıllı Metin Seçimi: Adres, url, telefon numarası veya e-posta metni gibi otomatik tanımlama işlemleri için kopyala / yapıştır işlemleri sağlanmaktadır. Uygulama seçilen metin türüne göre önerilir.

Yeni emojiler: Android O ile yeni ve eğlenceli emojiler geldi.

Otomatik doldurma: Google Chrome'un otomatik doldurma özelliği de Android'e geliyor. Artık uygulamaya giriş yaptığınızda kullanıcı adı ve şifresini otomatik olarak girme olanağına sahipsiniz.

TensorFlow Lite: Makine öğrenimi kütüphanesi. Cihazların uygulamalara entegre edilerek daha verimli çalışmasını sağlamak amaçlanmaktadır. Cihaz içi konuşma, arama vb.

Telefonunuzu 1 gb ram altındaki cihazlarda daha fazla kullanmanıza izin verir.
Telefon düzgün çalışması için basit bir arayüze sahip olacaktır.
Yalnızca işletim sistemi optimize edilmekle kalmayacak, aynı zamanda düşük profilli cihazlar için paralel uygulamalar optimize edilecektir. Chrome veri koruyucu, youtube go

Yeni tanıtılan DayDream, bir telefon olmadan da kullanılabilir. Gömülü ekran ve işlemci dahil gerekli donanıma sahiptir. Qualcom’un Snapdragon 835 VR platformu referans alınarak tasarlanmıştır.

DayDream Kulaklık, farklı markaların amiral gemisi telefonlarında uyumlu hale getirilecektir (Galaxy S8, LGE G6).

Kameranızı bilgi almak istediğiniz nesneye çevirdiğinizde, Google Lens nesneyi analiz eder ve size bilgi verir. Google Foto ve Google Asistan ile tümleşik.
Örneğin: Bir restoranın fotoğrafını analiz ederken, telefon numarası, fiyat bilgileri ve diğer kişilerin restoran hakkındaki yorumlarını iletir.

Google Foto’nın ayda 500 milyon aktif kullanıcısı var. Ve bu kullanıcılar ayda 1,2 milyar fotoğraf yüklüyor.

Önerilen Paylaşım: Fotoğraftaki kişileri otomatik olarak tanımanıza ve fotoğrafı onlarla hızlı bir şekilde paylaşmanıza olanak tanır.

Paylaşılan Kütüphaneler: Kriterlerinize göre fotoğrafları kütüphaneye ekleyerek fotoğraflarınızı otomatik olarak paylaşmanızı sağlar.

Fotoğraf Kitapları: Fotoğraflarınızdan güzel olanları seçebilir ve bir fotoğraf albümü yapabilirsiniz.

iphone ve ipad'ler kurulabilir.
Rahatça konuşamadığınız durumlarda asistanla iletişim kurabileceksiniz.
Google Lens ile entegre çalışacak. Böyle analiz fotoğraf hakkında size yardımcı olacaktır.
Yeni Google asistanı, sdk cihaz üreticilerinin asistanı cihazlarına entegre etmesini sağlar. Kokteyl hazırlama, klima vb.

Proaktif Yardım: Hatırlatıcılar ve alarmlar ayarlayabilirsiniz.

Trafik durumunu veya gecikmelerinizi uçuş bilgilerinizde bulabilirsiniz.

Ahizesiz görüşme: Google ana sayfalarında arama yapabileceksiniz. “Mum çağır”, ABD ve Kanada

Eğlence: Spotify, Deezer, Google Play müzik vb. Uygulamalar, istediğiniz komutları Google Home aracılığıyla sesli komutlarla çalacaktır.

Görsel Yanıt: Görüntüyü TV'ye veya telefonunuza aktarabilirsiniz.

Google Ana Sayfası komutları destekler:

Kumaşla Bütünleşme: Binbaşı çökertici Kumaştan gelen ateş tabanının bildirileceği bildirildi.

Telefonla doğrulama Firebase'e geliyor: Şu anda, Firebase, Facebook, Google +, Twitter ve normal giriş desteği. Ayrıca telefon numarası ile giriş yapmayı destekler.

Firebase Performans İzleme tanıtımı: Uygulama performansını veya servis aramalarının süresini inceleyebileceğimiz araç.

Firebase için Bulut İşlevli Dinamik Barındırma: Firebase'e arka uç kodu yazıp çalıştırabilirsiniz. Örnek olarak, kullanıcı bir fotoğraf yükledi. Bu fotoğrafın farklı boyutlarını oluşturabilirsiniz. Veya kullanıcıyı zorlayabilirsiniz.

Kotla

Jetbrains tarafından geliştirilen Kotlin yazılım dili şimdi resmen Google tarafından desteklenmektedir. Belgeler android geliştirici sitesinde göründü.
https://developer.android.com/kotlin/index.html İlgili belgeleri adresinde inceleyebilirsiniz.
Java 6 ve üzeri sürümlerde geliştirilen projeleri Kotlin'e dönüştürebilirsiniz.

Kotlin Programlama Dili: Kod → Java Dosyasını Kotlin'e Dönüştür Karşılık gelen java sınıfını cotlin sınıfına dönüştürebilirsiniz.

Düzen Düzenleyici: Sürükle ve bırak özelliğini kullanarak bir düzen tasarlamak kolaydır.

XML Yazı Tipleri ve İndirilebilir Yazı Tipleri: Yazı tipleri şimdi telefonun karşısında bir yerde olacak. Böylece apk boyutu bir miktar küçülecektir.

APK Analyzer İyileştirmeleri: Proguard apk ve proguard haritasını yükleyerek analiz edebilirsiniz.

Uyarlanabilir Simge Sihirbazı: Android O ile, kullanıcı ayarları altındaki uygulamaların simge görünümlerini değiştirebilecek.

Diğer özellikler: Mizanpaj Müfettişi, Aygıt Dosyası Gezgini, Android Profilcisi, CPU Profilcisi, Bellek Profilcisi, Ağ Profilcisi

İlgili sunumların kayıtları https://goo.gl/8pmyj İzleyebilirsin.

Yorum yapmak Lütfen giriş yapın veya Üye Ol.


Kısayollarla Örülü Solucan Delikleri


Kısayollarla Örülü Solucan Delikleri

Lorentzian Solucan Deliği

İnsanlar mobil uygulamalardan ne bekler?

Bilgisayarlar hayatımıza girildi beri, son kullanıcılar için işletim sistemi en en sık kullanılan alan masaüstü oldu. En kısa yoldan tüm uygulamalara ulaşmak isteyen, Windows masaüstünü kısayollarla doldurur ve sonra da bilgisayarlarının yavaşlığından yakınırdı. O zamanlar bir bilen olarak iki farklı açıklama yapma ihtimaliniz vardı; ya bu kadar kısayolu masaüstünde tutmamaları gösteriyor söyleyecektiniz ya da başka bir işletim sistemi kullanıyorlarsa daha çalışabilir çalışabilirlerini. Elbette ilk temizlemek açıklamak ve keşfetmek, onu zaman daha ayrıntılı. Siz de kolayına kaçtınız ya da bir başka bir deyişle, kısayolu seçtiniz.

İnsanların bu davranışı sergilemelerinin altında tek bir gerçek yatar; kısayoldan sonuca ulaşma isteği. Bu durum, uzaktaki teknolojiyle birlikte mobilleşen toplumların en büyük fiyatı olan hızın, zaman düzleminde onu geçen gün ivme kazanmasının bir yansımasıdır.

Şuanda bir mobil yaşadığımız dünya masaüstü programcılıktan kalan yegâne alışkanlığı, hâlâ son kullanıcılara yansıyan kısayol arayışıdır. Bu arayış, kendini akıllı telefonlarda mobil uygulamalarda hayat bulur. Bugünlerde son üründe hiçbir performans kaygısı olmadan masaüstüne hâlâ tüm sistemler için kısayol oluşturmaları zamangelen bir durumdur.

İşadamları makinalarını işlerini kolaylaştırmalarını ve bunları de bu işlerin hızlıca yapılmasını istiyor. Fiziksel olarak gerçekleştirebilecekleri süreç süreci mobil uygulamalarla yapmalarının altında yatan en büyük motivasyon, tam da bu kısayollardır. Hepimizin bir banka şubesine ulaşılabilirliği mümkündür; oraya temizleme, sıra beklemek, görevlilerle anlaşabilmek gibi muhtemel sıkıntı ve zaman kayıplarına uğramamak için mobil tesis çözümlemelerinizde planlamaız.

Toplumların sosyal hayatı dahi bu durumdan fazlasıyla etkilenir. Facebook'ta en çok kullanılan mobil uygulama, kısa yoldan daha fazla arkadaş bulmak için kullanılır. En sevdiğiniz ilkokul arkadaşlarınızı uzun uğraşlar ve zaman kayıplarıyla aradığınız yerde, tüm sınıf arkadaşlarınızı bulabilir, orada her zaman ulaşabilir, resimlerinizi ve daha çevreyi sosyal aktiviteyi gün içerisinde çok daha kısa sürede yapabilirsiniz. Hızlı (kısa) ve kolay (yol) sosyalleşebilme iste, istediğin tüm insanlarda bazen rastlanan sosyalleşme isteğinin günümüz şartlarına uygun şeklidir (Uzaktan Sosyalleşme).

Masaüstü bilgisayarların yüksek donanım gücüyle kapatabilirken erişebilecekleri, daha düşük donanımların bulunduğu akıllı telefonlarda da aynı şekilde beklenmesi, son kullanıcılar için anlaşılabilir bir durum. Ancak mobil cihazlar için bu kadar yüksek donanımların yok ve bu durum mobil programcılar için büyük bir handikap. İşte buradaki mobil programcılığın özü, hayatın diğer tümleşik olduğu gibi yerlerde giriyor.

Algı yönetimi

Algı yönetimini çeşitli mekanizmayla hayata geçirebilirsiniz. Bu araçlarmaların en etkilisi, geliştirici mobil tasarımı tasarım veya geliştirici arkadaşların anlayacağı bir dille UI'dir (Kullanıcı Arayüzü). Hayatında ilk kez 2008 yılında yazan biri olarak,% 50'sinin kullanıcı arayüzü olduğunu söylüyor. Algıyı yöneteceğiniz en önemli alan mobil uygulamalarda burasıdır. Yazdığınız uygulamanın yarısıdır. Çünkü; algı, uygulamanızı ve sizi rezilde yapabilir vezirdeğinizi uygulayın. Safraları çok çeşitli. Bazı geliştirici arkadaşların bunlara güldüklerini tahmin edebiliyorum. Gerçeklerle zamanla yüzleşmekte olan bir mobil cihazda. Bu tasarım; geliştiricilerin çok çok önem verdikleri mühendisliğin (geliştirme) iyi özeliklerini parlatır, kötü niyetli ve hatalarını kapatır. Makyaj gibi. İyi bir şekilde uygulayınca kullanacağınız kötü bir tasarım da sizi son nezdinde çok kötü bir uygulama sahibi yapabilir.

% 50'si tasarım olan mobil uygulamaların% 40'ı UX'dir (Kullanıcı Deneyimi). Gündemi yerde nerede UI / UX olarak bir arada gösterilmeye çalışılsa da, iki farklı alandır. Temelde kesiştikleri noktalar vardır ancak kesinlikle ayrı alanlardır. Ayrı bir geliştirme ve tasarlama zamanı isterler. UX için daha çok, tasarım ve geliştirmenin bir araya geldiği bir alan diyebiliriz. Kullanıcı alışkanlıklarının iyi gözlemlenmesi gerekir. Aynı zamanda psikolojik ve sosyolojik gözlemlere yönelik yönlendirmeler de, bu alışkanlıklar neticesinde sonuçlandırılmasıyla ortaya çıkıyor.

% 10 ise koddur. Bu kısıma daha fazla yorum yapın, sizi eminim hepiniz çok iyi birer geliştirici ya da geliştirici adaylığınız.

Maalesef günümüz mobil dünya gerçekleri içerisinde doğmayanlar, ya da böyle bir şekilde bu dünyaya entegre edilmiş şekilde çalışırlar ya da asla entegre olamazlar. Yine de tek bir öneride bulunmamasını; mobil geliştiricilerin, adaylarının, masaüstü programcılığının veya çok farklı alanlardan gelen proje yöneticilerinin asla unutmaması gereken anahtar sözcükler "kısayol" dur.

Mobil dünya eşittir hız! Bu yüzden eskiden kalma bir sözde, bu tip proje yöneticileri için durumu değiştiremeyeceği ne ki ki … "Zamanla düzelir". Eskiden bu sözde geçen 'zamanla' ile ifade edilen kavramın bugün yaratılış alanı algı aralığı çok daha kısalmıştı. Günümüzde hem hayatın başarısı hızlanması hem de bu doğa kanununun Şimdi ise buradaki "zaman" süresiyle ifade edilen süre, hesaplanamayacak kadar kısadır. Google'da Google, tüm gücüne ve sahibine sahip olduğu onca olmasına rağmen hâlâ sizlerin en ufak bilgisine ihtiyacınız duyar. Bu amaca yönelik yaklaşımlarda bulunur, kesin günümüzde en değerli şeye sadece en yüksek oranda sahip olmak yetmez.

"Mac OS X mimarisi". Sizin tek bir tuşla harekete geçmesini istediğiniz uygulamaların donanımda yansıması (Kaynak: Oytun Şengül).

Böylesi bir dünyada alışılmış bir teori veya pratik, esasında gibi yansımaz. Birileri gelir ve yarattıkları algıyla, sizden daha büyük bir toplumsal güç yönetilebilir (Algı Yönetimi) Bunu yapın, çok daha kolay bir kolaydan yol kılarak gerçekleştirir (Hız). Dahası bu yapıyı, sizden çok daha küçük ve daha az karmaşık bir fikirle yola çıkarak kurulmuş (Kısayollar). Ancak bu yapılar, esas ihtiyaca odaklanmış fikirler ve bu fikirlerin sosyo-psikolojik etkilerinin iyi gözlemlenmesi neticesinde elde edilir (UI / UX / Development).

Bu noktadan sonra Puzzle'ın parçalarını tamamlamayı sizlere bırakıyorum: Google> Facebook> Instagram> Foursquare> Twitter> ve belki de senin uygulaman!

Masaüstü programcılığı bir kenara bırakarak, içerisinden Servisleri alın. Bunları Bulut'a tuzak en iyi tasarım ve kullanıcı güvenliğiiyle ceplerinden kısayollar yaratın.

Mutlu Yıllar.


Android Uygulamalarda Doğru Dialog Kullanımları


Android Uygulamalarında Doğru İletişim Kullanımı

Mobil uygulamalarımızda görsel tasarım ve fonksiyonellik önemli olduğu için kullanım kolaylığı da önemlidir. Kullanıcı her işlemden sonra yönlendirilmek ve yapılan işlemler hakkında bilgi almak ister. Son anda bile bu süreçten vazgeçmeyi istiyor. Bir düğmeye basıldığında, işlemin gerçekleşmekte olup olmadığını görmek ister. Aynı şekilde yapılan bir işlemin sonucunu anında görmek istiyor. Bu gibi durumlarda, diyaloglar bir uygulamanın rehberliği, merakı ve sonuç veren sağlayıcılarıdır. Bu şartlarla diyalogların bir projenin olmazsa olmazı olduğunu söyleyebiliriz.

Mevcut birçok farklı diyalog var. Bazen bir sonuç göstermek, bazen bir eylemin ne zaman gerçekleştirildiğini onaylamak ve bazen kullanıcıya eylemin devam etmekte olduğunu göstermek için kullanırız. Daha birçok kullanım var. Önemli olan, uygulamanın sağlıklı çalışmasını sağlamak için doğru bilgiyi kullanıcıya aktarmak, şüpheleri ortadan kaldırmaktır.

Örneklere devam edersek, aşağıdaki iletişim kutusu kullanıcıyı bir işlemden sonra bilgilendirecektir. Kullanıcı şimdi işlemin başarıyla tamamlandığından emindir. Herhangi bir bildirim yoksa, kullanıcı kendisine şu anda ne olduğunu, işlemin bitip bitmediğini, başarılı olup olmadığını veya bir hata olup olmadığını sorabilir.

                public void showSimpleDialog (Görünüm görünümü) {

AlertDialog.Builder = oluşturucu
yeni AlertDialog.Builder (this);
builder.setTitle ("Process Result");
builder.setMessage ("İşleminiz başarılı oldu.");
builder.setcancelabl (yanlış);
builder.setNeutralButton ("Tamam", yeni DialogInterface.OnClickListener () {
@Override içinde
public void onClick (DialogInterface iletişim kutusuInterface, int i) {
toast.maketext (getapplicationcontext ()
"Tıkla" toast.length_long) .show ();
}
});
builder.creat A (). göstermek ();
}

Bu örnekte, kullanıcı evet / hayır iletişim kutusunu gösterir. Amaç kullanıcıdan onay almaktır. Kullanıcı bir form gönderiyor olabilir, sürecin son adımda olduğunu fark etmeyebilir veya ekstra geri silme tuşuna basıldığında uygulamadan çıkılabilir. Bu, kullanıcının yanlışlıkla formu göndermesini, yanlışlıkla uygulamadan ayrılmasını önler ve kullanıcının, şu anda geri dönüşü olmayan son adımda olduğu bilgisi verilir.

                public void showYesNoDialog (Görünüm görünümü) {
AlertDialog .Builder oluşturucu = new AlertDialog.Builder (bu);
builder.setMessage ("Çıkmak istediğinizden emin misiniz?");
builder.setcancelabl (yanlış);
builder.setPositiveButton ("Evet", yeni DialogInterface.OnClickListener () {
@Override içinde
public void onClick (DialogInterface iletişim kutusuInterface, int i) {
Bitiş ();
}
});

builder.setNegativeButton ("Hayır", yeni DialogInterface.OnClickListener () {
@Override içinde
public void onClick (DialogInterface iletişim kutusuInterface, int i) {

}
});
builder.creat A (). göstermek ();

}

Bu örnekte, ekran karmaşasından kurtulmak ve kullanıcının atması gereken adımı vurgulamak için diyaloglar kullanılır. 3 farklı uygulamada gerçekleştirilebilir. İsterseniz, ekrandan bir liste kaldırabilir ve listeden herhangi bir hat seçildiğinde iletişim kutusunu kapatabilirsiniz. Veya dengesiz kullanıcılar için seçilen hattı değiştirebilir, o hattı ve tamamlama düğmesini seçerek son kararı verebilirsiniz. Birden fazla seçenek varsa, diyalogdaki çoklu seçimden sonra işlemi tekrar tuşuyla tamamlayabilirsiniz.

                public void showListDialog (Görünüm görünümü) {
son CharSequence () öğeleri =
{"İstanbul", "Ankara", "İzmir", "Eskişehir", "Londra", "Londra"};
AlertDialog.Builder oluşturucu = yeni AlertDialog.Builder (bu);
builder.setTitle ("En sevdiğiniz şehir hangisi?");
builder.setcancelabl (yanlış);
builder.setItems (öğeler, yeni DialogInterface.OnClickListener () {
@Override içinde
public void onClick (DialogInterface iletişim kutusuInterface, int i) {
toast.maketext (getapplicationcontext ()
, Öğeler (i), toast.length_long) .show ();
}
});

builder.creat A (). göstermek ();
}

            int dizini;
public void showSingleChoice (Görünüm görünümü) {
final CharSequence () items = {"Siyah", "Beyaz", "Sarı", "Kırmızı", "Mavi"};
AlertDialog.Builder oluşturucu = yeni AlertDialog.Builder (bu);
builder.setTitle ("En sevdiğiniz renk nedir?");
builder.setcancelabl (yanlış);
builder.setSingleChoiceItems (items, 1, new DialogInterface.OnClickListener () {
@Override içinde
public void onClick (DialogInterface iletişim kutusuInterface, int i) {
index = i;
}
});
builder.setPositiveButton ("Tamam", yeni DialogInterface.OnClickListener () {
@Override içinde
public void onClick (DialogInterface iletişim kutusuInterface, int i) {
toast.maketext (getapplicationcontext (), items (index)
, Toast.length_long) .show ();
}
});
builder.setNegativeButton ("Cancel", yeni DialogInterface.OnClickListener () {
@Override içinde
public void onClick (DialogInterface iletişim kutusuInterface, int i) {
Toast.makeText (getApplicationContext (), "İşlem iptal edildi."
, Toast.length_long) .show ();
}
});
builder.creat A (). göstermek ();
}


            Liste selectedItems = new ArrayList();
public void showMultiChoice (Görünüm görünümü) {
son CharSequence () öğesi
= {"Futbol", "Basketbol", "Voleybol", "Yüzme", "Tenis"};
AlertDialog.Builder oluşturucu = yeni AlertDialog.Builder (bu);
builder.setcancelabl (yanlış);
builder.setTitle ("En sevdiğiniz spor hangileridir?");
selectedıtems.cle is ();
builder.setMultiChoiceItems (items, null, yeni DialogInterface.OnMultiChoiceClickListener () {
@Override içinde
public void onClick (DialogInterface iletişim kutusuInterface, int i, boolean isChecked) {
if (isChecked) {
selectedıtems.add ("" + öğe (i));
} Başka {
if (selectedıtems.contains (items (i))) {
selectedıtems.remov A (öğe (i));
}
}
}
});

builder.setPositiveButton ("Tamam", yeni DialogInterface.OnClickListener () {
@Override içinde
public void onClick (DialogInterface iletişim kutusuInterface, int i) {
StringBuilder sb = new StringBuilder ();
(int x = 0; x <selectedItems.size (); x ++) {için
sb.append (öğeler (x)). ekleme (",");
}
Dize sonucu = sb.toString ();
sonuç = sonuc.substring (0, sonuc.length () - 2);

sonuç + = "seçili";
toast.maketext (getapplicationcontext (), sonuç
toast.length_long) .show ();
}
});
builder.creat A (). göstermek ();

}

Diğer bir diyalog ekranı şekli, ilerleme diyalogu. Bu diyalog kullanıcıya cevap alması uzun sürdüğünde ve net olmadığı zaman gösterilmelidir. Örneğin, aradığınız bir web servisinin cevabı birçok kritere bağlı olarak değişir. İşlemin boyutu, yanıtın ne kadar karmaşık olduğu ve ağ bağlantı hızınız gibi öğeler bu kriterler arasındadır. Kullanıcı, bu uzun süreli işlemlerde şüphe içinde kalır. Acaba basamaz mıyım yoksa düğme şu anda çalışmıyor mu? Söyleyemediğim bir daha söyleme çabasına bile giremedim. Bir işlemin sonundan önce tekrarlanan istekler, uygulamanızın çökmesine ve kapanmasına neden olabilir.

            public void showProgressDialog (Görünüm görünümü) {
BackWorker bw = yeni BackWorker ();
bw.execut A ();
}
ProgressDialog iletişim kutusu;
sınıf BackWorker AsyncTask'ı genişletiyor {

@Override içinde
korumalı geçersiz onPreExecute () {
super.onpreexecut A ();
dialog = ProgressDialog.show (MainActivity.this, "Status",
"İşleminizi gerçekleştiriyor ...", doğru, yanlış);

}

@Override içinde
korumalı Void doInBackground (Void ... voids) {
Deneyin {
// işlemler bu bölümde gerçekleştirilir.
İplik uyku (3000);
}
yakalamak (İstisna e) {

}
null döndür;
}

@Override içinde
korumalı geçersiz onPostExecute (Void aVoid) {
super.onpostexecut to (önlemek);
dialog.dismiss ();
}
}

Ve nihayet özel bir şey olarak bilmemiz gereken her şey özel diyalog turumuzdur. Bu diyalogda, kullanıcı daha önce bahsettiğim listeden seçim yapmak, tekli seçimler yapmak ve çoklu seçimler yapmak gibi yapması gereken işleme odaklanmalıdır. Tüm işlemleri aynı ekrana koyduğunuz durumlar için işlemlerin karmaşasını ve görünürlükten kaçınmamızı sağlar.




    

    

    

    

    

                public void showCustomDialog (Görünüm görünümü) {
son İletişim Kutusu iletişim kutusu = yeni İletişim Kutusu (bu);
dialog.setTitle ("Kullanıcı Girişi");
dialog.setcontentview (R.layout.custom_dialog);
dialog.setcancelabl (yanlış);
final EditText editUsername = (EditText) dialog.findViewById (R.id.editText);
final EditText editPassword = (EditText) dialog.findViewById (R.id.editText2);
Düğme btnLogin = (Düğme) dialog.findViewById (R.id.btnLogin);
final TextView txtError = (TextView) dialog.findViewById (R.id.txtError);

btnLogin.setOnClickListener (yeni Görünüm.OnClickListener () {
@Override içinde
public void onClick (Görünüm görünümü) {
}
});
dialog.show ();
}

Projelerinizin başarılı olmasını dileyerek,

Erdin Dincer ile doğrudan iletişime geçin

Yorum yapmak Lütfen giriş yapın veya Üye Ol.


  • Copyright © 1996-2010 Bilgisayar Mühendisinin Notları. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress