getting Error inflating class fragment only in API 23 - android-fragments

This has been the biggest headache for me. I've been following the tutorial at
https://developers.google.com/maps/documentation/android-api/start?hl=en
but I always get a
android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class fragment
ONLY on api 23. This is the most confusing part. Other APIs over 18 work fine.
I believe I've covered all the basic components,
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:supportsRtl="true"
android:theme="#style/AppTheme" >
<meta-data android:name="com.google.android.gms.version"
android:value="#integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="#string/google_maps_key" />
<activity
android:name=".MainActivity"
android:label="#string/app_name"
android:theme="#style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
My google play version is up to date.(8487000)
I've tried placing the map fragment everywhere. Nothing seems to work.
activity_maps.xml
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="#+id/maps"
class ="com.google.android.gms.maps.SupportMapFragment" />
MapsActivity:
package com.example.michael.myapplication;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class MapsActivity extends android.support.v4.app.FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.maps);
mapFragment.getMapAsync(this);
}
#Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Add a marker in Sydney, Australia, and move the camera.
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
}

For anyone stumbling on this:
Reinstall your emulator. Seriously. That fixed it for me.

If you are testing on emulator, try removing and creating AVD again. I was also facing that issue and that fixed for me.

Related

problem with Install APK Programmatically in xamarin.forms

I have scenario where I have to download apk in background and install it without prompting any dialog to user. However when I try to install it using below code File
string mypath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;
var filePath = Path.Combine(mypath, fileName);
if (File.Exists(filePath))
{
string extention = Android.Webkit.MimeTypeMap.GetFileExtensionFromUrl(Android.Net.Uri.FromFile(new Java.IO.File(filePath)).ToString());
string mimeType = Android.Webkit.MimeTypeMap.Singleton.GetMimeTypeFromExtension(extention);
Context context = Android.App.Application.Context;
Android.Net.Uri fileUri = FileProvider.GetUriForFile(context, context.PackageName + ".provider", new Java.IO.File(filePath));
Intent intent = new Intent(Intent.ActionView);
intent.SetDataAndType(fileUri, mimeType);
intent.AddFlags(ActivityFlags.NewTask);
intent.AddFlags(ActivityFlags.GrantReadUriPermission);
context.StartActivity(intent);
}
and below code for xml file
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_file" path="." />
</paths>
and below code for AndroidManifest.xml file
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.fileprovider">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.permission.INSTALL_LOCATION_PROVIDER" />
<uses-permission android:name="android.permission.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application android:label="Fileprovider.Android" android:theme="#style/MainTheme">
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="#xml/file_paths"/>
</provider>
</application>
</manifest>
but when click button to open .apk file view below error
enter image description here
You cannot install APK without the prompt on Android. Actually I don't think you can do the similar thing on any modern operating system.

How to Detect Incoming MMS Messages on Android Devices using Xamarin.Forms?

I've looked at several questions on here and I'm sure I've made a mistake somewhere, but I cannot figure out why the Broadcast Receiver I made, MMSReceiver, is not notifying me that it received an MMS message via a toast or the information logs. What am I doing incorrectly?
Receiver class:
[BroadcastReceiver]
public class MMSReceiver : BroadcastReceiver
{
private static readonly string TAG = "MMS Broadcast Receiver";
public override void OnReceive(Context context, Intent intent)
{
Log.Info(TAG, "Intent received: " + intent.Action);
Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
}
}
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.App">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<application android:label="App.Android" android:theme="#style/MainTheme">
<!-- https://stackoverflow.com/questions/11289568/monitoring-mms-received-like-sms-received-on-android -->
<receiver android:name=".MMSReceiver">
<intent-filter android:priority="1000"> IntentFilterPriority.HighPriority is equal to 1000
<action android:name="android.provider.Telephony.MMS_RECEIVED"/>
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_MMS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <!-- Automatically starts at boot. -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <!-- Shows a pop-up window on top of all other applications, even if the app is not running in the foreground -->
</manifest>
For the Android4.4 version, Google offers SMS_DELIVER_ACTION (SMS) and WAP_PUSH_DELIVER_ACTION (MMS) intents for default SMS usage, meaning that only default SMS can receive these two broadcasts
Try to change the receiver in your Manifest.xml to :
<receiver android:name=".MMSReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED"/>
<data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
</receiver>

ViewPager fragment is sliding underneath the System bar

I have a companion configuration app for my watchface, which just presents the various settings as fragments (one for each setting so you can swipe through them quickly)
I would like the fragment views to be scrollable while maintaining the action bar, but what's happening instead is that if you swipe up on the action bar it disappears under the system bar and is very hard to move back.
Sorry if that's unclear, but here are a couple of screen shots.
Here are my various layout and code components; let me know if there's more I need:
AndroidManifest/xml
<?xml version="1.0" encoding="utf-8"?>
<uses-feature android:name="android.hardware.type.watch" android:required="false"/>
<!-- Required to act as a custom watch face. -->
<uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND" />
<!-- So we can keep the screen on and start vibrations -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE"/>
<application
android:allowBackup="true"
android:icon="#mipmap/ref_watch_icon"
android:supportsRtl="true"
android:theme="#style/AppTheme">
<activity
android:name=".RefWatch"
android:launchMode="singleTop"
android:theme="#style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name=
"com.pipperpublishing.RefWatch.wearable.watchface.CONFIG_DIGITAL" />
<category android:name=
"com.google.android.wearable.watchface.category.COMPANION_CONFIGURATION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
My activity's layout XML:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
android:id="#+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="#dimen/appbar_padding_top"
android:theme="#style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="#+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="#style/AppTheme.PopupOverlay">
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="#+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="#string/appbar_scrolling_view_behavior">
</android.support.v4.view.ViewPager>
<android.support.design.widget.FloatingActionButton
android:id="#+id/fab_previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|bottom"
android:layout_margin="#dimen/fab_margin"
android:src="#android:drawable/ic_media_rew" />
<android.support.design.widget.FloatingActionButton
android:id="#+id/fab_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="#dimen/fab_margin"
android:src="#android:drawable/ic_media_ff" />
and most of my OnCreate:
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ref_watch);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
...
/*-------------------------------------------------------------*/
/* Set up Settings Pager, Adapter, and floating action buttons */
/*-------------------------------------------------------------*/
...
// Create the adapter that will return a fragment for each of the menu setting sections
mSettingsPagerAdapter = new SettingsPagerAdapter(getSupportFragmentManager());
...
mSettingsViewPager = (ViewPager) findViewById(R.id.container);
...
// Set up the ViewPager with the Settings adapter.
mSettingsViewPager.setAdapter(mSettingsPagerAdapter);
...
This answered my question: https://guides.codepath.com/android/Using-the-App-ToolBar#using-toolbar-as-actionbar as well as some other stackoverflow questions. I added this code:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
params.setScrollFlags(0); // clear all scroll flags
and voila, Action Bar no longer scrolls under the system bar.

Android push notification not receive when internet is ON

1) I have implement the push notification.It works fine when device is connected to Internet.(i-e) receive notification from server side
2) when the device is not connected to Internet. if server send the push message.and then when the device is connected to Internet..it not receiving the push message .. this is the problem
3) It like to implement push message like whats app..when the device is connect to Internet ..it should receive the push message..
public class GcmIntentService extends GcmListenerService {
#Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("title");
String post_id=data.getString("id");
boolean pushactive= SharedPreference.getInstance().getBool(this,"pushactive");
if(pushactive)
generateNotification(message,post_id);
}
#Override
public void onCreate() {
super.onCreate();
System.out.println("inside GcmListenerService");
}
public void generateNotification(String message,String post_id)
{
Random random = new Random();
int m = random.nextInt(9999 - 1000) + 1000;
Intent intent = new Intent(this, NewsDetailActivity.class);
intent.putExtra("isPush", true);
intent.putExtra("post_id",post_id);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentText(message)
.setContentTitle("EGToday")
.setAutoCancel(true)
.setContentIntent(PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));
notificationManager.notify(m, mBuilder.build());
}
}
how to achieve this?
This is my intent service class.
this is my manifeast
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.egt">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission android:name="com.egt.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.egt.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application
android:name="com.egt.Constants.NetworkCall"
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:supportsRtl="true"
android:theme="#style/AppTheme">
<activity android:name=".View.SplashPage">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:windowSoftInputMode="stateHidden|adjustPan"
android:name=".View.MainActivity"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".View.NewsDetailActivity"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".View.SearchActivity"
android:screenOrientation="portrait">
</activity>
<receiver
android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.egt" />
</intent-filter>
</receiver>
<service
android:name="com.egt.PushNotification.GcmIntentService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service android:name="com.egt.PushNotification.GcmRegistration"
android:exported="false" />
</application>
</manifest>
In your server side set delayWhileIdle(true)
If the device is connected but idle, the message will still be
delivered right away unless the delay_while_idle flag is set to true.
Otherwise, it will be stored in the GCM servers until the device is
awake. And that's where the collapse_key flag plays a role: if there
is already a message with the same collapse key (and registration ID)
stored and waiting for delivery, the old message will be discarded and
the new message will take its place (that is, the old message will be
collapsed by the new one).
Ex.
Message message = new Message.Builder().delayWhileIdle(true).addData(MESSAGE_KEY,text).build();

android maps view blank

I am following the steps in google but can't see my map in fragment. bellow is the code. if guys please help me?
I already added google-play-services_lib with my project. testing in real device. using Google APIs
Mainfest: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mymaps"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="12"
android:targetSdkVersion="17" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"/>
<permission
android:name="com.example.mymap.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.example.mymap.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<activity
android:name="com.example.mymaps.MainActivity"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="MY KEY" />
<uses-library
android:name="com.google.android.maps"
android:required="true" />
</application>
</manifest>
UI XML:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="#dimen/activity_vertical_margin"
android:paddingLeft="#dimen/activity_horizontal_margin"
android:paddingRight="#dimen/activity_horizontal_margin"
android:paddingTop="#dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#string/hello_world" />
<fragment
android:id="#+id/the_map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment"
/>
</RelativeLayout>
MainActivity:
package com.example.mymaps;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
public class MainActivity extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
setContentView(R.layout.activity_main);
} catch (Exception e) {
System.out.print(e);
}
}
#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;
}
}
Put these lines on the AndroidManifest.xml file after the meta-data tag::
<meta-data android:name="com.google.android.gms.version"
android:value="#integer/google_play_services_version" />
Google has made it mandatory for android phones to have the google play services installed in order to use the map. So the tag checks for google play services is installed on the phone or not. If no, then it automatically redirects the user to google play site to get the required software installed..
If the problem still exists, then use this tutorial by Ravi Tamada and do not forget to add the lines mentioned in this answer.
http://www.androidhive.info/2013/08/android-working-with-google-maps-v2/
dec variable as global private GoogleMap googleMap;
extends FragmentActivity not Activity
after setContentView add this code
FragmentManager fragmentManager = getSupportFragmentManager();
SupportMapFragment mapFragment = (SupportMapFragment) fragmentManager
.findFragmentById(R.id.map);
googleMap = mapFragment.getMap();
googleMap.getUiSettings().setCompassEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.setMyLocationEnabled(true);
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.getUiSettings().setRotateGesturesEnabled(true);
in xml
<fragment
android:id="#+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment" />
if you generate the googleMap api key with currect pakage name this will work

Resources